/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};

/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {

/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;

/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};

/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);

/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;

/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}


/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;

/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;

/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";

/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	__webpack_require__(77);

	__webpack_require__(86);

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	__webpack_require__(87);

	var _fastclick = __webpack_require__(112);

	var _fastclick2 = _interopRequireDefault(_fastclick);

	__webpack_require__(113);

	__webpack_require__(128);

	__webpack_require__(127);

	__webpack_require__(142);

	__webpack_require__(126);

	__webpack_require__(143);

	__webpack_require__(144);

	__webpack_require__(145);

	__webpack_require__(146);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	//
	// app运行时启动脚本
	//

	//css font等样式资源加载


	//加载依赖
	_fastclick2.default.attach(document.body);
	//helper

	// import 'lib-flexible'

	//加载执行 核心view.js


	//一些内置能力可按需使用 如滑动回弹


	//加载核心模块后 按需加载third模块

/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(2), __esModule: true };

/***/ },
/* 2 */
/***/ function(module, exports, __webpack_require__) {

	var core  = __webpack_require__(3)
	  , $JSON = core.JSON || (core.JSON = {stringify: JSON.stringify});
	module.exports = function stringify(it){ // eslint-disable-line no-unused-vars
	  return $JSON.stringify.apply($JSON, arguments);
	};

/***/ },
/* 3 */
/***/ function(module, exports) {

	var core = module.exports = {version: '2.4.0'};
	if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef

/***/ },
/* 4 */,
/* 5 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(6), __esModule: true };

/***/ },
/* 6 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(7);
	var $Object = __webpack_require__(3).Object;
	module.exports = function defineProperty(it, key, desc){
	  return $Object.defineProperty(it, key, desc);
	};

/***/ },
/* 7 */
/***/ function(module, exports, __webpack_require__) {

	var $export = __webpack_require__(8);
	// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
	$export($export.S + $export.F * !__webpack_require__(17), 'Object', {defineProperty: __webpack_require__(13).f});

/***/ },
/* 8 */
/***/ function(module, exports, __webpack_require__) {

	var global    = __webpack_require__(9)
	  , core      = __webpack_require__(3)
	  , ctx       = __webpack_require__(10)
	  , hide      = __webpack_require__(12)
	  , PROTOTYPE = 'prototype';

	var $export = function(type, name, source){
	  var IS_FORCED = type & $export.F
	    , IS_GLOBAL = type & $export.G
	    , IS_STATIC = type & $export.S
	    , IS_PROTO  = type & $export.P
	    , IS_BIND   = type & $export.B
	    , IS_WRAP   = type & $export.W
	    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})
	    , expProto  = exports[PROTOTYPE]
	    , target    = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
	    , key, own, out;
	  if(IS_GLOBAL)source = name;
	  for(key in source){
	    // contains in native
	    own = !IS_FORCED && target && target[key] !== undefined;
	    if(own && key in exports)continue;
	    // export native or passed
	    out = own ? target[key] : source[key];
	    // prevent global pollution for namespaces
	    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
	    // bind timers to global for call from export context
	    : IS_BIND && own ? ctx(out, global)
	    // wrap global constructors for prevent change them in library
	    : IS_WRAP && target[key] == out ? (function(C){
	      var F = function(a, b, c){
	        if(this instanceof C){
	          switch(arguments.length){
	            case 0: return new C;
	            case 1: return new C(a);
	            case 2: return new C(a, b);
	          } return new C(a, b, c);
	        } return C.apply(this, arguments);
	      };
	      F[PROTOTYPE] = C[PROTOTYPE];
	      return F;
	    // make static versions for prototype methods
	    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
	    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
	    if(IS_PROTO){
	      (exports.virtual || (exports.virtual = {}))[key] = out;
	      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
	      if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);
	    }
	  }
	};
	// type bitmap
	$export.F = 1;   // forced
	$export.G = 2;   // global
	$export.S = 4;   // static
	$export.P = 8;   // proto
	$export.B = 16;  // bind
	$export.W = 32;  // wrap
	$export.U = 64;  // safe
	$export.R = 128; // real proto method for `library` 
	module.exports = $export;

/***/ },
/* 9 */
/***/ function(module, exports) {

	// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
	var global = module.exports = typeof window != 'undefined' && window.Math == Math
	  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
	if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef

/***/ },
/* 10 */
/***/ function(module, exports, __webpack_require__) {

	// optional / simple context binding
	var aFunction = __webpack_require__(11);
	module.exports = function(fn, that, length){
	  aFunction(fn);
	  if(that === undefined)return fn;
	  switch(length){
	    case 1: return function(a){
	      return fn.call(that, a);
	    };
	    case 2: return function(a, b){
	      return fn.call(that, a, b);
	    };
	    case 3: return function(a, b, c){
	      return fn.call(that, a, b, c);
	    };
	  }
	  return function(/* ...args */){
	    return fn.apply(that, arguments);
	  };
	};

/***/ },
/* 11 */
/***/ function(module, exports) {

	module.exports = function(it){
	  if(typeof it != 'function')throw TypeError(it + ' is not a function!');
	  return it;
	};

/***/ },
/* 12 */
/***/ function(module, exports, __webpack_require__) {

	var dP         = __webpack_require__(13)
	  , createDesc = __webpack_require__(21);
	module.exports = __webpack_require__(17) ? function(object, key, value){
	  return dP.f(object, key, createDesc(1, value));
	} : function(object, key, value){
	  object[key] = value;
	  return object;
	};

/***/ },
/* 13 */
/***/ function(module, exports, __webpack_require__) {

	var anObject       = __webpack_require__(14)
	  , IE8_DOM_DEFINE = __webpack_require__(16)
	  , toPrimitive    = __webpack_require__(20)
	  , dP             = Object.defineProperty;

	exports.f = __webpack_require__(17) ? Object.defineProperty : function defineProperty(O, P, Attributes){
	  anObject(O);
	  P = toPrimitive(P, true);
	  anObject(Attributes);
	  if(IE8_DOM_DEFINE)try {
	    return dP(O, P, Attributes);
	  } catch(e){ /* empty */ }
	  if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
	  if('value' in Attributes)O[P] = Attributes.value;
	  return O;
	};

/***/ },
/* 14 */
/***/ function(module, exports, __webpack_require__) {

	var isObject = __webpack_require__(15);
	module.exports = function(it){
	  if(!isObject(it))throw TypeError(it + ' is not an object!');
	  return it;
	};

/***/ },
/* 15 */
/***/ function(module, exports) {

	module.exports = function(it){
	  return typeof it === 'object' ? it !== null : typeof it === 'function';
	};

/***/ },
/* 16 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = !__webpack_require__(17) && !__webpack_require__(18)(function(){
	  return Object.defineProperty(__webpack_require__(19)('div'), 'a', {get: function(){ return 7; }}).a != 7;
	});

/***/ },
/* 17 */
/***/ function(module, exports, __webpack_require__) {

	// Thank's IE8 for his funny defineProperty
	module.exports = !__webpack_require__(18)(function(){
	  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
	});

/***/ },
/* 18 */
/***/ function(module, exports) {

	module.exports = function(exec){
	  try {
	    return !!exec();
	  } catch(e){
	    return true;
	  }
	};

/***/ },
/* 19 */
/***/ function(module, exports, __webpack_require__) {

	var isObject = __webpack_require__(15)
	  , document = __webpack_require__(9).document
	  // in old IE typeof document.createElement is 'object'
	  , is = isObject(document) && isObject(document.createElement);
	module.exports = function(it){
	  return is ? document.createElement(it) : {};
	};

/***/ },
/* 20 */
/***/ function(module, exports, __webpack_require__) {

	// 7.1.1 ToPrimitive(input [, PreferredType])
	var isObject = __webpack_require__(15);
	// instead of the ES6 spec version, we didn't implement @@toPrimitive case
	// and the second argument - flag - preferred type is a string
	module.exports = function(it, S){
	  if(!isObject(it))return it;
	  var fn, val;
	  if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
	  if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;
	  if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
	  throw TypeError("Can't convert object to primitive value");
	};

/***/ },
/* 21 */
/***/ function(module, exports) {

	module.exports = function(bitmap, value){
	  return {
	    enumerable  : !(bitmap & 1),
	    configurable: !(bitmap & 2),
	    writable    : !(bitmap & 4),
	    value       : value
	  };
	};

/***/ },
/* 22 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";

	exports.__esModule = true;

	var _iterator = __webpack_require__(23);

	var _iterator2 = _interopRequireDefault(_iterator);

	var _symbol = __webpack_require__(59);

	var _symbol2 = _interopRequireDefault(_symbol);

	var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default ? "symbol" : typeof obj; };

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
	  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
	} : function (obj) {
	  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
	};

/***/ },
/* 23 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(24), __esModule: true };

/***/ },
/* 24 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(25);
	__webpack_require__(54);
	module.exports = __webpack_require__(58).f('iterator');

/***/ },
/* 25 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	var $at  = __webpack_require__(26)(true);

	// 21.1.3.27 String.prototype[@@iterator]()
	__webpack_require__(29)(String, 'String', function(iterated){
	  this._t = String(iterated); // target
	  this._i = 0;                // next index
	// 21.1.5.2.1 %StringIteratorPrototype%.next()
	}, function(){
	  var O     = this._t
	    , index = this._i
	    , point;
	  if(index >= O.length)return {value: undefined, done: true};
	  point = $at(O, index);
	  this._i += point.length;
	  return {value: point, done: false};
	});

/***/ },
/* 26 */
/***/ function(module, exports, __webpack_require__) {

	var toInteger = __webpack_require__(27)
	  , defined   = __webpack_require__(28);
	// true  -> String#at
	// false -> String#codePointAt
	module.exports = function(TO_STRING){
	  return function(that, pos){
	    var s = String(defined(that))
	      , i = toInteger(pos)
	      , l = s.length
	      , a, b;
	    if(i < 0 || i >= l)return TO_STRING ? '' : undefined;
	    a = s.charCodeAt(i);
	    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
	      ? TO_STRING ? s.charAt(i) : a
	      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
	  };
	};

/***/ },
/* 27 */
/***/ function(module, exports) {

	// 7.1.4 ToInteger
	var ceil  = Math.ceil
	  , floor = Math.floor;
	module.exports = function(it){
	  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
	};

/***/ },
/* 28 */
/***/ function(module, exports) {

	// 7.2.1 RequireObjectCoercible(argument)
	module.exports = function(it){
	  if(it == undefined)throw TypeError("Can't call method on  " + it);
	  return it;
	};

/***/ },
/* 29 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	var LIBRARY        = __webpack_require__(30)
	  , $export        = __webpack_require__(8)
	  , redefine       = __webpack_require__(31)
	  , hide           = __webpack_require__(12)
	  , has            = __webpack_require__(32)
	  , Iterators      = __webpack_require__(33)
	  , $iterCreate    = __webpack_require__(34)
	  , setToStringTag = __webpack_require__(50)
	  , getPrototypeOf = __webpack_require__(52)
	  , ITERATOR       = __webpack_require__(51)('iterator')
	  , BUGGY          = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`
	  , FF_ITERATOR    = '@@iterator'
	  , KEYS           = 'keys'
	  , VALUES         = 'values';

	var returnThis = function(){ return this; };

	module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){
	  $iterCreate(Constructor, NAME, next);
	  var getMethod = function(kind){
	    if(!BUGGY && kind in proto)return proto[kind];
	    switch(kind){
	      case KEYS: return function keys(){ return new Constructor(this, kind); };
	      case VALUES: return function values(){ return new Constructor(this, kind); };
	    } return function entries(){ return new Constructor(this, kind); };
	  };
	  var TAG        = NAME + ' Iterator'
	    , DEF_VALUES = DEFAULT == VALUES
	    , VALUES_BUG = false
	    , proto      = Base.prototype
	    , $native    = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]
	    , $default   = $native || getMethod(DEFAULT)
	    , $entries   = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined
	    , $anyNative = NAME == 'Array' ? proto.entries || $native : $native
	    , methods, key, IteratorPrototype;
	  // Fix native
	  if($anyNative){
	    IteratorPrototype = getPrototypeOf($anyNative.call(new Base));
	    if(IteratorPrototype !== Object.prototype){
	      // Set @@toStringTag to native iterators
	      setToStringTag(IteratorPrototype, TAG, true);
	      // fix for some old engines
	      if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis);
	    }
	  }
	  // fix Array#{values, @@iterator}.name in V8 / FF
	  if(DEF_VALUES && $native && $native.name !== VALUES){
	    VALUES_BUG = true;
	    $default = function values(){ return $native.call(this); };
	  }
	  // Define iterator
	  if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){
	    hide(proto, ITERATOR, $default);
	  }
	  // Plug for library
	  Iterators[NAME] = $default;
	  Iterators[TAG]  = returnThis;
	  if(DEFAULT){
	    methods = {
	      values:  DEF_VALUES ? $default : getMethod(VALUES),
	      keys:    IS_SET     ? $default : getMethod(KEYS),
	      entries: $entries
	    };
	    if(FORCED)for(key in methods){
	      if(!(key in proto))redefine(proto, key, methods[key]);
	    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
	  }
	  return methods;
	};

/***/ },
/* 30 */
/***/ function(module, exports) {

	module.exports = true;

/***/ },
/* 31 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__(12);

/***/ },
/* 32 */
/***/ function(module, exports) {

	var hasOwnProperty = {}.hasOwnProperty;
	module.exports = function(it, key){
	  return hasOwnProperty.call(it, key);
	};

/***/ },
/* 33 */
/***/ function(module, exports) {

	module.exports = {};

/***/ },
/* 34 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	var create         = __webpack_require__(35)
	  , descriptor     = __webpack_require__(21)
	  , setToStringTag = __webpack_require__(50)
	  , IteratorPrototype = {};

	// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
	__webpack_require__(12)(IteratorPrototype, __webpack_require__(51)('iterator'), function(){ return this; });

	module.exports = function(Constructor, NAME, next){
	  Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)});
	  setToStringTag(Constructor, NAME + ' Iterator');
	};

/***/ },
/* 35 */
/***/ function(module, exports, __webpack_require__) {

	// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
	var anObject    = __webpack_require__(14)
	  , dPs         = __webpack_require__(36)
	  , enumBugKeys = __webpack_require__(48)
	  , IE_PROTO    = __webpack_require__(45)('IE_PROTO')
	  , Empty       = function(){ /* empty */ }
	  , PROTOTYPE   = 'prototype';

	// Create object with fake `null` prototype: use iframe Object with cleared prototype
	var createDict = function(){
	  // Thrash, waste and sodomy: IE GC bug
	  var iframe = __webpack_require__(19)('iframe')
	    , i      = enumBugKeys.length
	    , lt     = '<'
	    , gt     = '>'
	    , iframeDocument;
	  iframe.style.display = 'none';
	  __webpack_require__(49).appendChild(iframe);
	  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
	  // createDict = iframe.contentWindow.Object;
	  // html.removeChild(iframe);
	  iframeDocument = iframe.contentWindow.document;
	  iframeDocument.open();
	  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
	  iframeDocument.close();
	  createDict = iframeDocument.F;
	  while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]];
	  return createDict();
	};

	module.exports = Object.create || function create(O, Properties){
	  var result;
	  if(O !== null){
	    Empty[PROTOTYPE] = anObject(O);
	    result = new Empty;
	    Empty[PROTOTYPE] = null;
	    // add "__proto__" for Object.getPrototypeOf polyfill
	    result[IE_PROTO] = O;
	  } else result = createDict();
	  return Properties === undefined ? result : dPs(result, Properties);
	};


/***/ },
/* 36 */
/***/ function(module, exports, __webpack_require__) {

	var dP       = __webpack_require__(13)
	  , anObject = __webpack_require__(14)
	  , getKeys  = __webpack_require__(37);

	module.exports = __webpack_require__(17) ? Object.defineProperties : function defineProperties(O, Properties){
	  anObject(O);
	  var keys   = getKeys(Properties)
	    , length = keys.length
	    , i = 0
	    , P;
	  while(length > i)dP.f(O, P = keys[i++], Properties[P]);
	  return O;
	};

/***/ },
/* 37 */
/***/ function(module, exports, __webpack_require__) {

	// 19.1.2.14 / 15.2.3.14 Object.keys(O)
	var $keys       = __webpack_require__(38)
	  , enumBugKeys = __webpack_require__(48);

	module.exports = Object.keys || function keys(O){
	  return $keys(O, enumBugKeys);
	};

/***/ },
/* 38 */
/***/ function(module, exports, __webpack_require__) {

	var has          = __webpack_require__(32)
	  , toIObject    = __webpack_require__(39)
	  , arrayIndexOf = __webpack_require__(42)(false)
	  , IE_PROTO     = __webpack_require__(45)('IE_PROTO');

	module.exports = function(object, names){
	  var O      = toIObject(object)
	    , i      = 0
	    , result = []
	    , key;
	  for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);
	  // Don't enum bug & hidden keys
	  while(names.length > i)if(has(O, key = names[i++])){
	    ~arrayIndexOf(result, key) || result.push(key);
	  }
	  return result;
	};

/***/ },
/* 39 */
/***/ function(module, exports, __webpack_require__) {

	// to indexed object, toObject with fallback for non-array-like ES3 strings
	var IObject = __webpack_require__(40)
	  , defined = __webpack_require__(28);
	module.exports = function(it){
	  return IObject(defined(it));
	};

/***/ },
/* 40 */
/***/ function(module, exports, __webpack_require__) {

	// fallback for non-array-like ES3 and non-enumerable old V8 strings
	var cof = __webpack_require__(41);
	module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
	  return cof(it) == 'String' ? it.split('') : Object(it);
	};

/***/ },
/* 41 */
/***/ function(module, exports) {

	var toString = {}.toString;

	module.exports = function(it){
	  return toString.call(it).slice(8, -1);
	};

/***/ },
/* 42 */
/***/ function(module, exports, __webpack_require__) {

	// false -> Array#indexOf
	// true  -> Array#includes
	var toIObject = __webpack_require__(39)
	  , toLength  = __webpack_require__(43)
	  , toIndex   = __webpack_require__(44);
	module.exports = function(IS_INCLUDES){
	  return function($this, el, fromIndex){
	    var O      = toIObject($this)
	      , length = toLength(O.length)
	      , index  = toIndex(fromIndex, length)
	      , value;
	    // Array#includes uses SameValueZero equality algorithm
	    if(IS_INCLUDES && el != el)while(length > index){
	      value = O[index++];
	      if(value != value)return true;
	    // Array#toIndex ignores holes, Array#includes - not
	    } else for(;length > index; index++)if(IS_INCLUDES || index in O){
	      if(O[index] === el)return IS_INCLUDES || index || 0;
	    } return !IS_INCLUDES && -1;
	  };
	};

/***/ },
/* 43 */
/***/ function(module, exports, __webpack_require__) {

	// 7.1.15 ToLength
	var toInteger = __webpack_require__(27)
	  , min       = Math.min;
	module.exports = function(it){
	  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
	};

/***/ },
/* 44 */
/***/ function(module, exports, __webpack_require__) {

	var toInteger = __webpack_require__(27)
	  , max       = Math.max
	  , min       = Math.min;
	module.exports = function(index, length){
	  index = toInteger(index);
	  return index < 0 ? max(index + length, 0) : min(index, length);
	};

/***/ },
/* 45 */
/***/ function(module, exports, __webpack_require__) {

	var shared = __webpack_require__(46)('keys')
	  , uid    = __webpack_require__(47);
	module.exports = function(key){
	  return shared[key] || (shared[key] = uid(key));
	};

/***/ },
/* 46 */
/***/ function(module, exports, __webpack_require__) {

	var global = __webpack_require__(9)
	  , SHARED = '__core-js_shared__'
	  , store  = global[SHARED] || (global[SHARED] = {});
	module.exports = function(key){
	  return store[key] || (store[key] = {});
	};

/***/ },
/* 47 */
/***/ function(module, exports) {

	var id = 0
	  , px = Math.random();
	module.exports = function(key){
	  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
	};

/***/ },
/* 48 */
/***/ function(module, exports) {

	// IE 8- don't enum bug keys
	module.exports = (
	  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
	).split(',');

/***/ },
/* 49 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__(9).document && document.documentElement;

/***/ },
/* 50 */
/***/ function(module, exports, __webpack_require__) {

	var def = __webpack_require__(13).f
	  , has = __webpack_require__(32)
	  , TAG = __webpack_require__(51)('toStringTag');

	module.exports = function(it, tag, stat){
	  if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag});
	};

/***/ },
/* 51 */
/***/ function(module, exports, __webpack_require__) {

	var store      = __webpack_require__(46)('wks')
	  , uid        = __webpack_require__(47)
	  , Symbol     = __webpack_require__(9).Symbol
	  , USE_SYMBOL = typeof Symbol == 'function';

	var $exports = module.exports = function(name){
	  return store[name] || (store[name] =
	    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
	};

	$exports.store = store;

/***/ },
/* 52 */
/***/ function(module, exports, __webpack_require__) {

	// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
	var has         = __webpack_require__(32)
	  , toObject    = __webpack_require__(53)
	  , IE_PROTO    = __webpack_require__(45)('IE_PROTO')
	  , ObjectProto = Object.prototype;

	module.exports = Object.getPrototypeOf || function(O){
	  O = toObject(O);
	  if(has(O, IE_PROTO))return O[IE_PROTO];
	  if(typeof O.constructor == 'function' && O instanceof O.constructor){
	    return O.constructor.prototype;
	  } return O instanceof Object ? ObjectProto : null;
	};

/***/ },
/* 53 */
/***/ function(module, exports, __webpack_require__) {

	// 7.1.13 ToObject(argument)
	var defined = __webpack_require__(28);
	module.exports = function(it){
	  return Object(defined(it));
	};

/***/ },
/* 54 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(55);
	var global        = __webpack_require__(9)
	  , hide          = __webpack_require__(12)
	  , Iterators     = __webpack_require__(33)
	  , TO_STRING_TAG = __webpack_require__(51)('toStringTag');

	for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){
	  var NAME       = collections[i]
	    , Collection = global[NAME]
	    , proto      = Collection && Collection.prototype;
	  if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME);
	  Iterators[NAME] = Iterators.Array;
	}

/***/ },
/* 55 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	var addToUnscopables = __webpack_require__(56)
	  , step             = __webpack_require__(57)
	  , Iterators        = __webpack_require__(33)
	  , toIObject        = __webpack_require__(39);

	// 22.1.3.4 Array.prototype.entries()
	// 22.1.3.13 Array.prototype.keys()
	// 22.1.3.29 Array.prototype.values()
	// 22.1.3.30 Array.prototype[@@iterator]()
	module.exports = __webpack_require__(29)(Array, 'Array', function(iterated, kind){
	  this._t = toIObject(iterated); // target
	  this._i = 0;                   // next index
	  this._k = kind;                // kind
	// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
	}, function(){
	  var O     = this._t
	    , kind  = this._k
	    , index = this._i++;
	  if(!O || index >= O.length){
	    this._t = undefined;
	    return step(1);
	  }
	  if(kind == 'keys'  )return step(0, index);
	  if(kind == 'values')return step(0, O[index]);
	  return step(0, [index, O[index]]);
	}, 'values');

	// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
	Iterators.Arguments = Iterators.Array;

	addToUnscopables('keys');
	addToUnscopables('values');
	addToUnscopables('entries');

/***/ },
/* 56 */
/***/ function(module, exports) {

	module.exports = function(){ /* empty */ };

/***/ },
/* 57 */
/***/ function(module, exports) {

	module.exports = function(done, value){
	  return {value: value, done: !!done};
	};

/***/ },
/* 58 */
/***/ function(module, exports, __webpack_require__) {

	exports.f = __webpack_require__(51);

/***/ },
/* 59 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(60), __esModule: true };

/***/ },
/* 60 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(61);
	__webpack_require__(72);
	__webpack_require__(73);
	__webpack_require__(74);
	module.exports = __webpack_require__(3).Symbol;

/***/ },
/* 61 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	// ECMAScript 6 symbols shim
	var global         = __webpack_require__(9)
	  , has            = __webpack_require__(32)
	  , DESCRIPTORS    = __webpack_require__(17)
	  , $export        = __webpack_require__(8)
	  , redefine       = __webpack_require__(31)
	  , META           = __webpack_require__(62).KEY
	  , $fails         = __webpack_require__(18)
	  , shared         = __webpack_require__(46)
	  , setToStringTag = __webpack_require__(50)
	  , uid            = __webpack_require__(47)
	  , wks            = __webpack_require__(51)
	  , wksExt         = __webpack_require__(58)
	  , wksDefine      = __webpack_require__(63)
	  , keyOf          = __webpack_require__(64)
	  , enumKeys       = __webpack_require__(65)
	  , isArray        = __webpack_require__(68)
	  , anObject       = __webpack_require__(14)
	  , toIObject      = __webpack_require__(39)
	  , toPrimitive    = __webpack_require__(20)
	  , createDesc     = __webpack_require__(21)
	  , _create        = __webpack_require__(35)
	  , gOPNExt        = __webpack_require__(69)
	  , $GOPD          = __webpack_require__(71)
	  , $DP            = __webpack_require__(13)
	  , $keys          = __webpack_require__(37)
	  , gOPD           = $GOPD.f
	  , dP             = $DP.f
	  , gOPN           = gOPNExt.f
	  , $Symbol        = global.Symbol
	  , $JSON          = global.JSON
	  , _stringify     = $JSON && $JSON.stringify
	  , PROTOTYPE      = 'prototype'
	  , HIDDEN         = wks('_hidden')
	  , TO_PRIMITIVE   = wks('toPrimitive')
	  , isEnum         = {}.propertyIsEnumerable
	  , SymbolRegistry = shared('symbol-registry')
	  , AllSymbols     = shared('symbols')
	  , OPSymbols      = shared('op-symbols')
	  , ObjectProto    = Object[PROTOTYPE]
	  , USE_NATIVE     = typeof $Symbol == 'function'
	  , QObject        = global.QObject;
	// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
	var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;

	// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
	var setSymbolDesc = DESCRIPTORS && $fails(function(){
	  return _create(dP({}, 'a', {
	    get: function(){ return dP(this, 'a', {value: 7}).a; }
	  })).a != 7;
	}) ? function(it, key, D){
	  var protoDesc = gOPD(ObjectProto, key);
	  if(protoDesc)delete ObjectProto[key];
	  dP(it, key, D);
	  if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);
	} : dP;

	var wrap = function(tag){
	  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
	  sym._k = tag;
	  return sym;
	};

	var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){
	  return typeof it == 'symbol';
	} : function(it){
	  return it instanceof $Symbol;
	};

	var $defineProperty = function defineProperty(it, key, D){
	  if(it === ObjectProto)$defineProperty(OPSymbols, key, D);
	  anObject(it);
	  key = toPrimitive(key, true);
	  anObject(D);
	  if(has(AllSymbols, key)){
	    if(!D.enumerable){
	      if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));
	      it[HIDDEN][key] = true;
	    } else {
	      if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
	      D = _create(D, {enumerable: createDesc(0, false)});
	    } return setSymbolDesc(it, key, D);
	  } return dP(it, key, D);
	};
	var $defineProperties = function defineProperties(it, P){
	  anObject(it);
	  var keys = enumKeys(P = toIObject(P))
	    , i    = 0
	    , l = keys.length
	    , key;
	  while(l > i)$defineProperty(it, key = keys[i++], P[key]);
	  return it;
	};
	var $create = function create(it, P){
	  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
	};
	var $propertyIsEnumerable = function propertyIsEnumerable(key){
	  var E = isEnum.call(this, key = toPrimitive(key, true));
	  if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;
	  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
	};
	var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
	  it  = toIObject(it);
	  key = toPrimitive(key, true);
	  if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;
	  var D = gOPD(it, key);
	  if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
	  return D;
	};
	var $getOwnPropertyNames = function getOwnPropertyNames(it){
	  var names  = gOPN(toIObject(it))
	    , result = []
	    , i      = 0
	    , key;
	  while(names.length > i){
	    if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);
	  } return result;
	};
	var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
	  var IS_OP  = it === ObjectProto
	    , names  = gOPN(IS_OP ? OPSymbols : toIObject(it))
	    , result = []
	    , i      = 0
	    , key;
	  while(names.length > i){
	    if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);
	  } return result;
	};

	// 19.4.1.1 Symbol([description])
	if(!USE_NATIVE){
	  $Symbol = function Symbol(){
	    if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');
	    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
	    var $set = function(value){
	      if(this === ObjectProto)$set.call(OPSymbols, value);
	      if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;
	      setSymbolDesc(this, tag, createDesc(1, value));
	    };
	    if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});
	    return wrap(tag);
	  };
	  redefine($Symbol[PROTOTYPE], 'toString', function toString(){
	    return this._k;
	  });

	  $GOPD.f = $getOwnPropertyDescriptor;
	  $DP.f   = $defineProperty;
	  __webpack_require__(70).f = gOPNExt.f = $getOwnPropertyNames;
	  __webpack_require__(67).f  = $propertyIsEnumerable;
	  __webpack_require__(66).f = $getOwnPropertySymbols;

	  if(DESCRIPTORS && !__webpack_require__(30)){
	    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
	  }

	  wksExt.f = function(name){
	    return wrap(wks(name));
	  }
	}

	$export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});

	for(var symbols = (
	  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
	  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
	).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);

	for(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);

	$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
	  // 19.4.2.1 Symbol.for(key)
	  'for': function(key){
	    return has(SymbolRegistry, key += '')
	      ? SymbolRegistry[key]
	      : SymbolRegistry[key] = $Symbol(key);
	  },
	  // 19.4.2.5 Symbol.keyFor(sym)
	  keyFor: function keyFor(key){
	    if(isSymbol(key))return keyOf(SymbolRegistry, key);
	    throw TypeError(key + ' is not a symbol!');
	  },
	  useSetter: function(){ setter = true; },
	  useSimple: function(){ setter = false; }
	});

	$export($export.S + $export.F * !USE_NATIVE, 'Object', {
	  // 19.1.2.2 Object.create(O [, Properties])
	  create: $create,
	  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
	  defineProperty: $defineProperty,
	  // 19.1.2.3 Object.defineProperties(O, Properties)
	  defineProperties: $defineProperties,
	  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
	  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
	  // 19.1.2.7 Object.getOwnPropertyNames(O)
	  getOwnPropertyNames: $getOwnPropertyNames,
	  // 19.1.2.8 Object.getOwnPropertySymbols(O)
	  getOwnPropertySymbols: $getOwnPropertySymbols
	});

	// 24.3.2 JSON.stringify(value [, replacer [, space]])
	$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){
	  var S = $Symbol();
	  // MS Edge converts symbol values to JSON as {}
	  // WebKit converts symbol values to JSON as null
	  // V8 throws on boxed symbols
	  return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';
	})), 'JSON', {
	  stringify: function stringify(it){
	    if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined
	    var args = [it]
	      , i    = 1
	      , replacer, $replacer;
	    while(arguments.length > i)args.push(arguments[i++]);
	    replacer = args[1];
	    if(typeof replacer == 'function')$replacer = replacer;
	    if($replacer || !isArray(replacer))replacer = function(key, value){
	      if($replacer)value = $replacer.call(this, key, value);
	      if(!isSymbol(value))return value;
	    };
	    args[1] = replacer;
	    return _stringify.apply($JSON, args);
	  }
	});

	// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
	$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(12)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
	// 19.4.3.5 Symbol.prototype[@@toStringTag]
	setToStringTag($Symbol, 'Symbol');
	// 20.2.1.9 Math[@@toStringTag]
	setToStringTag(Math, 'Math', true);
	// 24.3.3 JSON[@@toStringTag]
	setToStringTag(global.JSON, 'JSON', true);

/***/ },
/* 62 */
/***/ function(module, exports, __webpack_require__) {

	var META     = __webpack_require__(47)('meta')
	  , isObject = __webpack_require__(15)
	  , has      = __webpack_require__(32)
	  , setDesc  = __webpack_require__(13).f
	  , id       = 0;
	var isExtensible = Object.isExtensible || function(){
	  return true;
	};
	var FREEZE = !__webpack_require__(18)(function(){
	  return isExtensible(Object.preventExtensions({}));
	});
	var setMeta = function(it){
	  setDesc(it, META, {value: {
	    i: 'O' + ++id, // object ID
	    w: {}          // weak collections IDs
	  }});
	};
	var fastKey = function(it, create){
	  // return primitive with prefix
	  if(!isObject(it))return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
	  if(!has(it, META)){
	    // can't set metadata to uncaught frozen object
	    if(!isExtensible(it))return 'F';
	    // not necessary to add metadata
	    if(!create)return 'E';
	    // add missing metadata
	    setMeta(it);
	  // return object ID
	  } return it[META].i;
	};
	var getWeak = function(it, create){
	  if(!has(it, META)){
	    // can't set metadata to uncaught frozen object
	    if(!isExtensible(it))return true;
	    // not necessary to add metadata
	    if(!create)return false;
	    // add missing metadata
	    setMeta(it);
	  // return hash weak collections IDs
	  } return it[META].w;
	};
	// add metadata on freeze-family methods calling
	var onFreeze = function(it){
	  if(FREEZE && meta.NEED && isExtensible(it) && !has(it, META))setMeta(it);
	  return it;
	};
	var meta = module.exports = {
	  KEY:      META,
	  NEED:     false,
	  fastKey:  fastKey,
	  getWeak:  getWeak,
	  onFreeze: onFreeze
	};

/***/ },
/* 63 */
/***/ function(module, exports, __webpack_require__) {

	var global         = __webpack_require__(9)
	  , core           = __webpack_require__(3)
	  , LIBRARY        = __webpack_require__(30)
	  , wksExt         = __webpack_require__(58)
	  , defineProperty = __webpack_require__(13).f;
	module.exports = function(name){
	  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
	  if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)});
	};

/***/ },
/* 64 */
/***/ function(module, exports, __webpack_require__) {

	var getKeys   = __webpack_require__(37)
	  , toIObject = __webpack_require__(39);
	module.exports = function(object, el){
	  var O      = toIObject(object)
	    , keys   = getKeys(O)
	    , length = keys.length
	    , index  = 0
	    , key;
	  while(length > index)if(O[key = keys[index++]] === el)return key;
	};

/***/ },
/* 65 */
/***/ function(module, exports, __webpack_require__) {

	// all enumerable object keys, includes symbols
	var getKeys = __webpack_require__(37)
	  , gOPS    = __webpack_require__(66)
	  , pIE     = __webpack_require__(67);
	module.exports = function(it){
	  var result     = getKeys(it)
	    , getSymbols = gOPS.f;
	  if(getSymbols){
	    var symbols = getSymbols(it)
	      , isEnum  = pIE.f
	      , i       = 0
	      , key;
	    while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key);
	  } return result;
	};

/***/ },
/* 66 */
/***/ function(module, exports) {

	exports.f = Object.getOwnPropertySymbols;

/***/ },
/* 67 */
/***/ function(module, exports) {

	exports.f = {}.propertyIsEnumerable;

/***/ },
/* 68 */
/***/ function(module, exports, __webpack_require__) {

	// 7.2.2 IsArray(argument)
	var cof = __webpack_require__(41);
	module.exports = Array.isArray || function isArray(arg){
	  return cof(arg) == 'Array';
	};

/***/ },
/* 69 */
/***/ function(module, exports, __webpack_require__) {

	// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
	var toIObject = __webpack_require__(39)
	  , gOPN      = __webpack_require__(70).f
	  , toString  = {}.toString;

	var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
	  ? Object.getOwnPropertyNames(window) : [];

	var getWindowNames = function(it){
	  try {
	    return gOPN(it);
	  } catch(e){
	    return windowNames.slice();
	  }
	};

	module.exports.f = function getOwnPropertyNames(it){
	  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
	};


/***/ },
/* 70 */
/***/ function(module, exports, __webpack_require__) {

	// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
	var $keys      = __webpack_require__(38)
	  , hiddenKeys = __webpack_require__(48).concat('length', 'prototype');

	exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O){
	  return $keys(O, hiddenKeys);
	};

/***/ },
/* 71 */
/***/ function(module, exports, __webpack_require__) {

	var pIE            = __webpack_require__(67)
	  , createDesc     = __webpack_require__(21)
	  , toIObject      = __webpack_require__(39)
	  , toPrimitive    = __webpack_require__(20)
	  , has            = __webpack_require__(32)
	  , IE8_DOM_DEFINE = __webpack_require__(16)
	  , gOPD           = Object.getOwnPropertyDescriptor;

	exports.f = __webpack_require__(17) ? gOPD : function getOwnPropertyDescriptor(O, P){
	  O = toIObject(O);
	  P = toPrimitive(P, true);
	  if(IE8_DOM_DEFINE)try {
	    return gOPD(O, P);
	  } catch(e){ /* empty */ }
	  if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]);
	};

/***/ },
/* 72 */
/***/ function(module, exports) {

	

/***/ },
/* 73 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(63)('asyncIterator');

/***/ },
/* 74 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(63)('observable');

/***/ },
/* 75 */
/***/ function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;//     Underscore.js 1.8.3
	//     http://underscorejs.org
	//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
	//     Underscore may be freely distributed under the MIT license.

	(function() {

	  // Baseline setup
	  // --------------

	  // Establish the root object, `window` in the browser, or `exports` on the server.
	  var root = this;

	  // Save the previous value of the `_` variable.
	  var previousUnderscore = root._;

	  // Save bytes in the minified (but not gzipped) version:
	  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;

	  // Create quick reference variables for speed access to core prototypes.
	  var
	    push             = ArrayProto.push,
	    slice            = ArrayProto.slice,
	    toString         = ObjProto.toString,
	    hasOwnProperty   = ObjProto.hasOwnProperty;

	  // All **ECMAScript 5** native function implementations that we hope to use
	  // are declared here.
	  var
	    nativeIsArray      = Array.isArray,
	    nativeKeys         = Object.keys,
	    nativeBind         = FuncProto.bind,
	    nativeCreate       = Object.create;

	  // Naked function reference for surrogate-prototype-swapping.
	  var Ctor = function(){};

	  // Create a safe reference to the Underscore object for use below.
	  var _ = function(obj) {
	    if (obj instanceof _) return obj;
	    if (!(this instanceof _)) return new _(obj);
	    this._wrapped = obj;
	  };

	  // Export the Underscore object for **Node.js**, with
	  // backwards-compatibility for the old `require()` API. If we're in
	  // the browser, add `_` as a global object.
	  if (true) {
	    if (typeof module !== 'undefined' && module.exports) {
	      exports = module.exports = _;
	    }
	    exports._ = _;
	  } else {
	    root._ = _;
	  }

	  // Current version.
	  _.VERSION = '1.8.3';

	  // Internal function that returns an efficient (for current engines) version
	  // of the passed-in callback, to be repeatedly applied in other Underscore
	  // functions.
	  var optimizeCb = function(func, context, argCount) {
	    if (context === void 0) return func;
	    switch (argCount == null ? 3 : argCount) {
	      case 1: return function(value) {
	        return func.call(context, value);
	      };
	      case 2: return function(value, other) {
	        return func.call(context, value, other);
	      };
	      case 3: return function(value, index, collection) {
	        return func.call(context, value, index, collection);
	      };
	      case 4: return function(accumulator, value, index, collection) {
	        return func.call(context, accumulator, value, index, collection);
	      };
	    }
	    return function() {
	      return func.apply(context, arguments);
	    };
	  };

	  // A mostly-internal function to generate callbacks that can be applied
	  // to each element in a collection, returning the desired result — either
	  // identity, an arbitrary callback, a property matcher, or a property accessor.
	  var cb = function(value, context, argCount) {
	    if (value == null) return _.identity;
	    if (_.isFunction(value)) return optimizeCb(value, context, argCount);
	    if (_.isObject(value)) return _.matcher(value);
	    return _.property(value);
	  };
	  _.iteratee = function(value, context) {
	    return cb(value, context, Infinity);
	  };

	  // An internal function for creating assigner functions.
	  var createAssigner = function(keysFunc, undefinedOnly) {
	    return function(obj) {
	      var length = arguments.length;
	      if (length < 2 || obj == null) return obj;
	      for (var index = 1; index < length; index++) {
	        var source = arguments[index],
	            keys = keysFunc(source),
	            l = keys.length;
	        for (var i = 0; i < l; i++) {
	          var key = keys[i];
	          if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
	        }
	      }
	      return obj;
	    };
	  };

	  // An internal function for creating a new object that inherits from another.
	  var baseCreate = function(prototype) {
	    if (!_.isObject(prototype)) return {};
	    if (nativeCreate) return nativeCreate(prototype);
	    Ctor.prototype = prototype;
	    var result = new Ctor;
	    Ctor.prototype = null;
	    return result;
	  };

	  var property = function(key) {
	    return function(obj) {
	      return obj == null ? void 0 : obj[key];
	    };
	  };

	  // Helper for collection methods to determine whether a collection
	  // should be iterated as an array or as an object
	  // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
	  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
	  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
	  var getLength = property('length');
	  var isArrayLike = function(collection) {
	    var length = getLength(collection);
	    return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
	  };

	  // Collection Functions
	  // --------------------

	  // The cornerstone, an `each` implementation, aka `forEach`.
	  // Handles raw objects in addition to array-likes. Treats all
	  // sparse array-likes as if they were dense.
	  _.each = _.forEach = function(obj, iteratee, context) {
	    iteratee = optimizeCb(iteratee, context);
	    var i, length;
	    if (isArrayLike(obj)) {
	      for (i = 0, length = obj.length; i < length; i++) {
	        iteratee(obj[i], i, obj);
	      }
	    } else {
	      var keys = _.keys(obj);
	      for (i = 0, length = keys.length; i < length; i++) {
	        iteratee(obj[keys[i]], keys[i], obj);
	      }
	    }
	    return obj;
	  };

	  // Return the results of applying the iteratee to each element.
	  _.map = _.collect = function(obj, iteratee, context) {
	    iteratee = cb(iteratee, context);
	    var keys = !isArrayLike(obj) && _.keys(obj),
	        length = (keys || obj).length,
	        results = Array(length);
	    for (var index = 0; index < length; index++) {
	      var currentKey = keys ? keys[index] : index;
	      results[index] = iteratee(obj[currentKey], currentKey, obj);
	    }
	    return results;
	  };

	  // Create a reducing function iterating left or right.
	  function createReduce(dir) {
	    // Optimized iterator function as using arguments.length
	    // in the main function will deoptimize the, see #1991.
	    function iterator(obj, iteratee, memo, keys, index, length) {
	      for (; index >= 0 && index < length; index += dir) {
	        var currentKey = keys ? keys[index] : index;
	        memo = iteratee(memo, obj[currentKey], currentKey, obj);
	      }
	      return memo;
	    }

	    return function(obj, iteratee, memo, context) {
	      iteratee = optimizeCb(iteratee, context, 4);
	      var keys = !isArrayLike(obj) && _.keys(obj),
	          length = (keys || obj).length,
	          index = dir > 0 ? 0 : length - 1;
	      // Determine the initial value if none is provided.
	      if (arguments.length < 3) {
	        memo = obj[keys ? keys[index] : index];
	        index += dir;
	      }
	      return iterator(obj, iteratee, memo, keys, index, length);
	    };
	  }

	  // **Reduce** builds up a single result from a list of values, aka `inject`,
	  // or `foldl`.
	  _.reduce = _.foldl = _.inject = createReduce(1);

	  // The right-associative version of reduce, also known as `foldr`.
	  _.reduceRight = _.foldr = createReduce(-1);

	  // Return the first value which passes a truth test. Aliased as `detect`.
	  _.find = _.detect = function(obj, predicate, context) {
	    var key;
	    if (isArrayLike(obj)) {
	      key = _.findIndex(obj, predicate, context);
	    } else {
	      key = _.findKey(obj, predicate, context);
	    }
	    if (key !== void 0 && key !== -1) return obj[key];
	  };

	  // Return all the elements that pass a truth test.
	  // Aliased as `select`.
	  _.filter = _.select = function(obj, predicate, context) {
	    var results = [];
	    predicate = cb(predicate, context);
	    _.each(obj, function(value, index, list) {
	      if (predicate(value, index, list)) results.push(value);
	    });
	    return results;
	  };

	  // Return all the elements for which a truth test fails.
	  _.reject = function(obj, predicate, context) {
	    return _.filter(obj, _.negate(cb(predicate)), context);
	  };

	  // Determine whether all of the elements match a truth test.
	  // Aliased as `all`.
	  _.every = _.all = function(obj, predicate, context) {
	    predicate = cb(predicate, context);
	    var keys = !isArrayLike(obj) && _.keys(obj),
	        length = (keys || obj).length;
	    for (var index = 0; index < length; index++) {
	      var currentKey = keys ? keys[index] : index;
	      if (!predicate(obj[currentKey], currentKey, obj)) return false;
	    }
	    return true;
	  };

	  // Determine if at least one element in the object matches a truth test.
	  // Aliased as `any`.
	  _.some = _.any = function(obj, predicate, context) {
	    predicate = cb(predicate, context);
	    var keys = !isArrayLike(obj) && _.keys(obj),
	        length = (keys || obj).length;
	    for (var index = 0; index < length; index++) {
	      var currentKey = keys ? keys[index] : index;
	      if (predicate(obj[currentKey], currentKey, obj)) return true;
	    }
	    return false;
	  };

	  // Determine if the array or object contains a given item (using `===`).
	  // Aliased as `includes` and `include`.
	  _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
	    if (!isArrayLike(obj)) obj = _.values(obj);
	    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
	    return _.indexOf(obj, item, fromIndex) >= 0;
	  };

	  // Invoke a method (with arguments) on every item in a collection.
	  _.invoke = function(obj, method) {
	    var args = slice.call(arguments, 2);
	    var isFunc = _.isFunction(method);
	    return _.map(obj, function(value) {
	      var func = isFunc ? method : value[method];
	      return func == null ? func : func.apply(value, args);
	    });
	  };

	  // Convenience version of a common use case of `map`: fetching a property.
	  _.pluck = function(obj, key) {
	    return _.map(obj, _.property(key));
	  };

	  // Convenience version of a common use case of `filter`: selecting only objects
	  // containing specific `key:value` pairs.
	  _.where = function(obj, attrs) {
	    return _.filter(obj, _.matcher(attrs));
	  };

	  // Convenience version of a common use case of `find`: getting the first object
	  // containing specific `key:value` pairs.
	  _.findWhere = function(obj, attrs) {
	    return _.find(obj, _.matcher(attrs));
	  };

	  // Return the maximum element (or element-based computation).
	  _.max = function(obj, iteratee, context) {
	    var result = -Infinity, lastComputed = -Infinity,
	        value, computed;
	    if (iteratee == null && obj != null) {
	      obj = isArrayLike(obj) ? obj : _.values(obj);
	      for (var i = 0, length = obj.length; i < length; i++) {
	        value = obj[i];
	        if (value > result) {
	          result = value;
	        }
	      }
	    } else {
	      iteratee = cb(iteratee, context);
	      _.each(obj, function(value, index, list) {
	        computed = iteratee(value, index, list);
	        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
	          result = value;
	          lastComputed = computed;
	        }
	      });
	    }
	    return result;
	  };

	  // Return the minimum element (or element-based computation).
	  _.min = function(obj, iteratee, context) {
	    var result = Infinity, lastComputed = Infinity,
	        value, computed;
	    if (iteratee == null && obj != null) {
	      obj = isArrayLike(obj) ? obj : _.values(obj);
	      for (var i = 0, length = obj.length; i < length; i++) {
	        value = obj[i];
	        if (value < result) {
	          result = value;
	        }
	      }
	    } else {
	      iteratee = cb(iteratee, context);
	      _.each(obj, function(value, index, list) {
	        computed = iteratee(value, index, list);
	        if (computed < lastComputed || computed === Infinity && result === Infinity) {
	          result = value;
	          lastComputed = computed;
	        }
	      });
	    }
	    return result;
	  };

	  // Shuffle a collection, using the modern version of the
	  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
	  _.shuffle = function(obj) {
	    var set = isArrayLike(obj) ? obj : _.values(obj);
	    var length = set.length;
	    var shuffled = Array(length);
	    for (var index = 0, rand; index < length; index++) {
	      rand = _.random(0, index);
	      if (rand !== index) shuffled[index] = shuffled[rand];
	      shuffled[rand] = set[index];
	    }
	    return shuffled;
	  };

	  // Sample **n** random values from a collection.
	  // If **n** is not specified, returns a single random element.
	  // The internal `guard` argument allows it to work with `map`.
	  _.sample = function(obj, n, guard) {
	    if (n == null || guard) {
	      if (!isArrayLike(obj)) obj = _.values(obj);
	      return obj[_.random(obj.length - 1)];
	    }
	    return _.shuffle(obj).slice(0, Math.max(0, n));
	  };

	  // Sort the object's values by a criterion produced by an iteratee.
	  _.sortBy = function(obj, iteratee, context) {
	    iteratee = cb(iteratee, context);
	    return _.pluck(_.map(obj, function(value, index, list) {
	      return {
	        value: value,
	        index: index,
	        criteria: iteratee(value, index, list)
	      };
	    }).sort(function(left, right) {
	      var a = left.criteria;
	      var b = right.criteria;
	      if (a !== b) {
	        if (a > b || a === void 0) return 1;
	        if (a < b || b === void 0) return -1;
	      }
	      return left.index - right.index;
	    }), 'value');
	  };

	  // An internal function used for aggregate "group by" operations.
	  var group = function(behavior) {
	    return function(obj, iteratee, context) {
	      var result = {};
	      iteratee = cb(iteratee, context);
	      _.each(obj, function(value, index) {
	        var key = iteratee(value, index, obj);
	        behavior(result, value, key);
	      });
	      return result;
	    };
	  };

	  // Groups the object's values by a criterion. Pass either a string attribute
	  // to group by, or a function that returns the criterion.
	  _.groupBy = group(function(result, value, key) {
	    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
	  });

	  // Indexes the object's values by a criterion, similar to `groupBy`, but for
	  // when you know that your index values will be unique.
	  _.indexBy = group(function(result, value, key) {
	    result[key] = value;
	  });

	  // Counts instances of an object that group by a certain criterion. Pass
	  // either a string attribute to count by, or a function that returns the
	  // criterion.
	  _.countBy = group(function(result, value, key) {
	    if (_.has(result, key)) result[key]++; else result[key] = 1;
	  });

	  // Safely create a real, live array from anything iterable.
	  _.toArray = function(obj) {
	    if (!obj) return [];
	    if (_.isArray(obj)) return slice.call(obj);
	    if (isArrayLike(obj)) return _.map(obj, _.identity);
	    return _.values(obj);
	  };

	  // Return the number of elements in an object.
	  _.size = function(obj) {
	    if (obj == null) return 0;
	    return isArrayLike(obj) ? obj.length : _.keys(obj).length;
	  };

	  // Split a collection into two arrays: one whose elements all satisfy the given
	  // predicate, and one whose elements all do not satisfy the predicate.
	  _.partition = function(obj, predicate, context) {
	    predicate = cb(predicate, context);
	    var pass = [], fail = [];
	    _.each(obj, function(value, key, obj) {
	      (predicate(value, key, obj) ? pass : fail).push(value);
	    });
	    return [pass, fail];
	  };

	  // Array Functions
	  // ---------------

	  // Get the first element of an array. Passing **n** will return the first N
	  // values in the array. Aliased as `head` and `take`. The **guard** check
	  // allows it to work with `_.map`.
	  _.first = _.head = _.take = function(array, n, guard) {
	    if (array == null) return void 0;
	    if (n == null || guard) return array[0];
	    return _.initial(array, array.length - n);
	  };

	  // Returns everything but the last entry of the array. Especially useful on
	  // the arguments object. Passing **n** will return all the values in
	  // the array, excluding the last N.
	  _.initial = function(array, n, guard) {
	    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
	  };

	  // Get the last element of an array. Passing **n** will return the last N
	  // values in the array.
	  _.last = function(array, n, guard) {
	    if (array == null) return void 0;
	    if (n == null || guard) return array[array.length - 1];
	    return _.rest(array, Math.max(0, array.length - n));
	  };

	  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
	  // Especially useful on the arguments object. Passing an **n** will return
	  // the rest N values in the array.
	  _.rest = _.tail = _.drop = function(array, n, guard) {
	    return slice.call(array, n == null || guard ? 1 : n);
	  };

	  // Trim out all falsy values from an array.
	  _.compact = function(array) {
	    return _.filter(array, _.identity);
	  };

	  // Internal implementation of a recursive `flatten` function.
	  var flatten = function(input, shallow, strict, startIndex) {
	    var output = [], idx = 0;
	    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
	      var value = input[i];
	      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
	        //flatten current level of array or arguments object
	        if (!shallow) value = flatten(value, shallow, strict);
	        var j = 0, len = value.length;
	        output.length += len;
	        while (j < len) {
	          output[idx++] = value[j++];
	        }
	      } else if (!strict) {
	        output[idx++] = value;
	      }
	    }
	    return output;
	  };

	  // Flatten out an array, either recursively (by default), or just one level.
	  _.flatten = function(array, shallow) {
	    return flatten(array, shallow, false);
	  };

	  // Return a version of the array that does not contain the specified value(s).
	  _.without = function(array) {
	    return _.difference(array, slice.call(arguments, 1));
	  };

	  // Produce a duplicate-free version of the array. If the array has already
	  // been sorted, you have the option of using a faster algorithm.
	  // Aliased as `unique`.
	  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
	    if (!_.isBoolean(isSorted)) {
	      context = iteratee;
	      iteratee = isSorted;
	      isSorted = false;
	    }
	    if (iteratee != null) iteratee = cb(iteratee, context);
	    var result = [];
	    var seen = [];
	    for (var i = 0, length = getLength(array); i < length; i++) {
	      var value = array[i],
	          computed = iteratee ? iteratee(value, i, array) : value;
	      if (isSorted) {
	        if (!i || seen !== computed) result.push(value);
	        seen = computed;
	      } else if (iteratee) {
	        if (!_.contains(seen, computed)) {
	          seen.push(computed);
	          result.push(value);
	        }
	      } else if (!_.contains(result, value)) {
	        result.push(value);
	      }
	    }
	    return result;
	  };

	  // Produce an array that contains the union: each distinct element from all of
	  // the passed-in arrays.
	  _.union = function() {
	    return _.uniq(flatten(arguments, true, true));
	  };

	  // Produce an array that contains every item shared between all the
	  // passed-in arrays.
	  _.intersection = function(array) {
	    var result = [];
	    var argsLength = arguments.length;
	    for (var i = 0, length = getLength(array); i < length; i++) {
	      var item = array[i];
	      if (_.contains(result, item)) continue;
	      for (var j = 1; j < argsLength; j++) {
	        if (!_.contains(arguments[j], item)) break;
	      }
	      if (j === argsLength) result.push(item);
	    }
	    return result;
	  };

	  // Take the difference between one array and a number of other arrays.
	  // Only the elements present in just the first array will remain.
	  _.difference = function(array) {
	    var rest = flatten(arguments, true, true, 1);
	    return _.filter(array, function(value){
	      return !_.contains(rest, value);
	    });
	  };

	  // Zip together multiple lists into a single array -- elements that share
	  // an index go together.
	  _.zip = function() {
	    return _.unzip(arguments);
	  };

	  // Complement of _.zip. Unzip accepts an array of arrays and groups
	  // each array's elements on shared indices
	  _.unzip = function(array) {
	    var length = array && _.max(array, getLength).length || 0;
	    var result = Array(length);

	    for (var index = 0; index < length; index++) {
	      result[index] = _.pluck(array, index);
	    }
	    return result;
	  };

	  // Converts lists into objects. Pass either a single array of `[key, value]`
	  // pairs, or two parallel arrays of the same length -- one of keys, and one of
	  // the corresponding values.
	  _.object = function(list, values) {
	    var result = {};
	    for (var i = 0, length = getLength(list); i < length; i++) {
	      if (values) {
	        result[list[i]] = values[i];
	      } else {
	        result[list[i][0]] = list[i][1];
	      }
	    }
	    return result;
	  };

	  // Generator function to create the findIndex and findLastIndex functions
	  function createPredicateIndexFinder(dir) {
	    return function(array, predicate, context) {
	      predicate = cb(predicate, context);
	      var length = getLength(array);
	      var index = dir > 0 ? 0 : length - 1;
	      for (; index >= 0 && index < length; index += dir) {
	        if (predicate(array[index], index, array)) return index;
	      }
	      return -1;
	    };
	  }

	  // Returns the first index on an array-like that passes a predicate test
	  _.findIndex = createPredicateIndexFinder(1);
	  _.findLastIndex = createPredicateIndexFinder(-1);

	  // Use a comparator function to figure out the smallest index at which
	  // an object should be inserted so as to maintain order. Uses binary search.
	  _.sortedIndex = function(array, obj, iteratee, context) {
	    iteratee = cb(iteratee, context, 1);
	    var value = iteratee(obj);
	    var low = 0, high = getLength(array);
	    while (low < high) {
	      var mid = Math.floor((low + high) / 2);
	      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
	    }
	    return low;
	  };

	  // Generator function to create the indexOf and lastIndexOf functions
	  function createIndexFinder(dir, predicateFind, sortedIndex) {
	    return function(array, item, idx) {
	      var i = 0, length = getLength(array);
	      if (typeof idx == 'number') {
	        if (dir > 0) {
	            i = idx >= 0 ? idx : Math.max(idx + length, i);
	        } else {
	            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
	        }
	      } else if (sortedIndex && idx && length) {
	        idx = sortedIndex(array, item);
	        return array[idx] === item ? idx : -1;
	      }
	      if (item !== item) {
	        idx = predicateFind(slice.call(array, i, length), _.isNaN);
	        return idx >= 0 ? idx + i : -1;
	      }
	      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
	        if (array[idx] === item) return idx;
	      }
	      return -1;
	    };
	  }

	  // Return the position of the first occurrence of an item in an array,
	  // or -1 if the item is not included in the array.
	  // If the array is large and already in sort order, pass `true`
	  // for **isSorted** to use binary search.
	  _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
	  _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);

	  // Generate an integer Array containing an arithmetic progression. A port of
	  // the native Python `range()` function. See
	  // [the Python documentation](http://docs.python.org/library/functions.html#range).
	  _.range = function(start, stop, step) {
	    if (stop == null) {
	      stop = start || 0;
	      start = 0;
	    }
	    step = step || 1;

	    var length = Math.max(Math.ceil((stop - start) / step), 0);
	    var range = Array(length);

	    for (var idx = 0; idx < length; idx++, start += step) {
	      range[idx] = start;
	    }

	    return range;
	  };

	  // Function (ahem) Functions
	  // ------------------

	  // Determines whether to execute a function as a constructor
	  // or a normal function with the provided arguments
	  var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
	    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
	    var self = baseCreate(sourceFunc.prototype);
	    var result = sourceFunc.apply(self, args);
	    if (_.isObject(result)) return result;
	    return self;
	  };

	  // Create a function bound to a given object (assigning `this`, and arguments,
	  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
	  // available.
	  _.bind = function(func, context) {
	    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
	    if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
	    var args = slice.call(arguments, 2);
	    var bound = function() {
	      return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
	    };
	    return bound;
	  };

	  // Partially apply a function by creating a version that has had some of its
	  // arguments pre-filled, without changing its dynamic `this` context. _ acts
	  // as a placeholder, allowing any combination of arguments to be pre-filled.
	  _.partial = function(func) {
	    var boundArgs = slice.call(arguments, 1);
	    var bound = function() {
	      var position = 0, length = boundArgs.length;
	      var args = Array(length);
	      for (var i = 0; i < length; i++) {
	        args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
	      }
	      while (position < arguments.length) args.push(arguments[position++]);
	      return executeBound(func, bound, this, this, args);
	    };
	    return bound;
	  };

	  // Bind a number of an object's methods to that object. Remaining arguments
	  // are the method names to be bound. Useful for ensuring that all callbacks
	  // defined on an object belong to it.
	  _.bindAll = function(obj) {
	    var i, length = arguments.length, key;
	    if (length <= 1) throw new Error('bindAll must be passed function names');
	    for (i = 1; i < length; i++) {
	      key = arguments[i];
	      obj[key] = _.bind(obj[key], obj);
	    }
	    return obj;
	  };

	  // Memoize an expensive function by storing its results.
	  _.memoize = function(func, hasher) {
	    var memoize = function(key) {
	      var cache = memoize.cache;
	      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
	      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
	      return cache[address];
	    };
	    memoize.cache = {};
	    return memoize;
	  };

	  // Delays a function for the given number of milliseconds, and then calls
	  // it with the arguments supplied.
	  _.delay = function(func, wait) {
	    var args = slice.call(arguments, 2);
	    return setTimeout(function(){
	      return func.apply(null, args);
	    }, wait);
	  };

	  // Defers a function, scheduling it to run after the current call stack has
	  // cleared.
	  _.defer = _.partial(_.delay, _, 1);

	  // Returns a function, that, when invoked, will only be triggered at most once
	  // during a given window of time. Normally, the throttled function will run
	  // as much as it can, without ever going more than once per `wait` duration;
	  // but if you'd like to disable the execution on the leading edge, pass
	  // `{leading: false}`. To disable execution on the trailing edge, ditto.
	  _.throttle = function(func, wait, options) {
	    var context, args, result;
	    var timeout = null;
	    var previous = 0;
	    if (!options) options = {};
	    var later = function() {
	      previous = options.leading === false ? 0 : _.now();
	      timeout = null;
	      result = func.apply(context, args);
	      if (!timeout) context = args = null;
	    };
	    return function() {
	      var now = _.now();
	      if (!previous && options.leading === false) previous = now;
	      var remaining = wait - (now - previous);
	      context = this;
	      args = arguments;
	      if (remaining <= 0 || remaining > wait) {
	        if (timeout) {
	          clearTimeout(timeout);
	          timeout = null;
	        }
	        previous = now;
	        result = func.apply(context, args);
	        if (!timeout) context = args = null;
	      } else if (!timeout && options.trailing !== false) {
	        timeout = setTimeout(later, remaining);
	      }
	      return result;
	    };
	  };

	  // Returns a function, that, as long as it continues to be invoked, will not
	  // be triggered. The function will be called after it stops being called for
	  // N milliseconds. If `immediate` is passed, trigger the function on the
	  // leading edge, instead of the trailing.
	  _.debounce = function(func, wait, immediate) {
	    var timeout, args, context, timestamp, result;

	    var later = function() {
	      var last = _.now() - timestamp;

	      if (last < wait && last >= 0) {
	        timeout = setTimeout(later, wait - last);
	      } else {
	        timeout = null;
	        if (!immediate) {
	          result = func.apply(context, args);
	          if (!timeout) context = args = null;
	        }
	      }
	    };

	    return function() {
	      context = this;
	      args = arguments;
	      timestamp = _.now();
	      var callNow = immediate && !timeout;
	      if (!timeout) timeout = setTimeout(later, wait);
	      if (callNow) {
	        result = func.apply(context, args);
	        context = args = null;
	      }

	      return result;
	    };
	  };

	  // Returns the first function passed as an argument to the second,
	  // allowing you to adjust arguments, run code before and after, and
	  // conditionally execute the original function.
	  _.wrap = function(func, wrapper) {
	    return _.partial(wrapper, func);
	  };

	  // Returns a negated version of the passed-in predicate.
	  _.negate = function(predicate) {
	    return function() {
	      return !predicate.apply(this, arguments);
	    };
	  };

	  // Returns a function that is the composition of a list of functions, each
	  // consuming the return value of the function that follows.
	  _.compose = function() {
	    var args = arguments;
	    var start = args.length - 1;
	    return function() {
	      var i = start;
	      var result = args[start].apply(this, arguments);
	      while (i--) result = args[i].call(this, result);
	      return result;
	    };
	  };

	  // Returns a function that will only be executed on and after the Nth call.
	  _.after = function(times, func) {
	    return function() {
	      if (--times < 1) {
	        return func.apply(this, arguments);
	      }
	    };
	  };

	  // Returns a function that will only be executed up to (but not including) the Nth call.
	  _.before = function(times, func) {
	    var memo;
	    return function() {
	      if (--times > 0) {
	        memo = func.apply(this, arguments);
	      }
	      if (times <= 1) func = null;
	      return memo;
	    };
	  };

	  // Returns a function that will be executed at most one time, no matter how
	  // often you call it. Useful for lazy initialization.
	  _.once = _.partial(_.before, 2);

	  // Object Functions
	  // ----------------

	  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
	  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
	  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
	                      'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

	  function collectNonEnumProps(obj, keys) {
	    var nonEnumIdx = nonEnumerableProps.length;
	    var constructor = obj.constructor;
	    var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;

	    // Constructor is a special case.
	    var prop = 'constructor';
	    if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);

	    while (nonEnumIdx--) {
	      prop = nonEnumerableProps[nonEnumIdx];
	      if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
	        keys.push(prop);
	      }
	    }
	  }

	  // Retrieve the names of an object's own properties.
	  // Delegates to **ECMAScript 5**'s native `Object.keys`
	  _.keys = function(obj) {
	    if (!_.isObject(obj)) return [];
	    if (nativeKeys) return nativeKeys(obj);
	    var keys = [];
	    for (var key in obj) if (_.has(obj, key)) keys.push(key);
	    // Ahem, IE < 9.
	    if (hasEnumBug) collectNonEnumProps(obj, keys);
	    return keys;
	  };

	  // Retrieve all the property names of an object.
	  _.allKeys = function(obj) {
	    if (!_.isObject(obj)) return [];
	    var keys = [];
	    for (var key in obj) keys.push(key);
	    // Ahem, IE < 9.
	    if (hasEnumBug) collectNonEnumProps(obj, keys);
	    return keys;
	  };

	  // Retrieve the values of an object's properties.
	  _.values = function(obj) {
	    var keys = _.keys(obj);
	    var length = keys.length;
	    var values = Array(length);
	    for (var i = 0; i < length; i++) {
	      values[i] = obj[keys[i]];
	    }
	    return values;
	  };

	  // Returns the results of applying the iteratee to each element of the object
	  // In contrast to _.map it returns an object
	  _.mapObject = function(obj, iteratee, context) {
	    iteratee = cb(iteratee, context);
	    var keys =  _.keys(obj),
	          length = keys.length,
	          results = {},
	          currentKey;
	      for (var index = 0; index < length; index++) {
	        currentKey = keys[index];
	        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
	      }
	      return results;
	  };

	  // Convert an object into a list of `[key, value]` pairs.
	  _.pairs = function(obj) {
	    var keys = _.keys(obj);
	    var length = keys.length;
	    var pairs = Array(length);
	    for (var i = 0; i < length; i++) {
	      pairs[i] = [keys[i], obj[keys[i]]];
	    }
	    return pairs;
	  };

	  // Invert the keys and values of an object. The values must be serializable.
	  _.invert = function(obj) {
	    var result = {};
	    var keys = _.keys(obj);
	    for (var i = 0, length = keys.length; i < length; i++) {
	      result[obj[keys[i]]] = keys[i];
	    }
	    return result;
	  };

	  // Return a sorted list of the function names available on the object.
	  // Aliased as `methods`
	  _.functions = _.methods = function(obj) {
	    var names = [];
	    for (var key in obj) {
	      if (_.isFunction(obj[key])) names.push(key);
	    }
	    return names.sort();
	  };

	  // Extend a given object with all the properties in passed-in object(s).
	  _.extend = createAssigner(_.allKeys);

	  // Assigns a given object with all the own properties in the passed-in object(s)
	  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
	  _.extendOwn = _.assign = createAssigner(_.keys);

	  // Returns the first key on an object that passes a predicate test
	  _.findKey = function(obj, predicate, context) {
	    predicate = cb(predicate, context);
	    var keys = _.keys(obj), key;
	    for (var i = 0, length = keys.length; i < length; i++) {
	      key = keys[i];
	      if (predicate(obj[key], key, obj)) return key;
	    }
	  };

	  // Return a copy of the object only containing the whitelisted properties.
	  _.pick = function(object, oiteratee, context) {
	    var result = {}, obj = object, iteratee, keys;
	    if (obj == null) return result;
	    if (_.isFunction(oiteratee)) {
	      keys = _.allKeys(obj);
	      iteratee = optimizeCb(oiteratee, context);
	    } else {
	      keys = flatten(arguments, false, false, 1);
	      iteratee = function(value, key, obj) { return key in obj; };
	      obj = Object(obj);
	    }
	    for (var i = 0, length = keys.length; i < length; i++) {
	      var key = keys[i];
	      var value = obj[key];
	      if (iteratee(value, key, obj)) result[key] = value;
	    }
	    return result;
	  };

	   // Return a copy of the object without the blacklisted properties.
	  _.omit = function(obj, iteratee, context) {
	    if (_.isFunction(iteratee)) {
	      iteratee = _.negate(iteratee);
	    } else {
	      var keys = _.map(flatten(arguments, false, false, 1), String);
	      iteratee = function(value, key) {
	        return !_.contains(keys, key);
	      };
	    }
	    return _.pick(obj, iteratee, context);
	  };

	  // Fill in a given object with default properties.
	  _.defaults = createAssigner(_.allKeys, true);

	  // Creates an object that inherits from the given prototype object.
	  // If additional properties are provided then they will be added to the
	  // created object.
	  _.create = function(prototype, props) {
	    var result = baseCreate(prototype);
	    if (props) _.extendOwn(result, props);
	    return result;
	  };

	  // Create a (shallow-cloned) duplicate of an object.
	  _.clone = function(obj) {
	    if (!_.isObject(obj)) return obj;
	    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
	  };

	  // Invokes interceptor with the obj, and then returns obj.
	  // The primary purpose of this method is to "tap into" a method chain, in
	  // order to perform operations on intermediate results within the chain.
	  _.tap = function(obj, interceptor) {
	    interceptor(obj);
	    return obj;
	  };

	  // Returns whether an object has a given set of `key:value` pairs.
	  _.isMatch = function(object, attrs) {
	    var keys = _.keys(attrs), length = keys.length;
	    if (object == null) return !length;
	    var obj = Object(object);
	    for (var i = 0; i < length; i++) {
	      var key = keys[i];
	      if (attrs[key] !== obj[key] || !(key in obj)) return false;
	    }
	    return true;
	  };


	  // Internal recursive comparison function for `isEqual`.
	  var eq = function(a, b, aStack, bStack) {
	    // Identical objects are equal. `0 === -0`, but they aren't identical.
	    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
	    if (a === b) return a !== 0 || 1 / a === 1 / b;
	    // A strict comparison is necessary because `null == undefined`.
	    if (a == null || b == null) return a === b;
	    // Unwrap any wrapped objects.
	    if (a instanceof _) a = a._wrapped;
	    if (b instanceof _) b = b._wrapped;
	    // Compare `[[Class]]` names.
	    var className = toString.call(a);
	    if (className !== toString.call(b)) return false;
	    switch (className) {
	      // Strings, numbers, regular expressions, dates, and booleans are compared by value.
	      case '[object RegExp]':
	      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
	      case '[object String]':
	        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
	        // equivalent to `new String("5")`.
	        return '' + a === '' + b;
	      case '[object Number]':
	        // `NaN`s are equivalent, but non-reflexive.
	        // Object(NaN) is equivalent to NaN
	        if (+a !== +a) return +b !== +b;
	        // An `egal` comparison is performed for other numeric values.
	        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
	      case '[object Date]':
	      case '[object Boolean]':
	        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
	        // millisecond representations. Note that invalid dates with millisecond representations
	        // of `NaN` are not equivalent.
	        return +a === +b;
	    }

	    var areArrays = className === '[object Array]';
	    if (!areArrays) {
	      if (typeof a != 'object' || typeof b != 'object') return false;

	      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
	      // from different frames are.
	      var aCtor = a.constructor, bCtor = b.constructor;
	      if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
	                               _.isFunction(bCtor) && bCtor instanceof bCtor)
	                          && ('constructor' in a && 'constructor' in b)) {
	        return false;
	      }
	    }
	    // Assume equality for cyclic structures. The algorithm for detecting cyclic
	    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.

	    // Initializing stack of traversed objects.
	    // It's done here since we only need them for objects and arrays comparison.
	    aStack = aStack || [];
	    bStack = bStack || [];
	    var length = aStack.length;
	    while (length--) {
	      // Linear search. Performance is inversely proportional to the number of
	      // unique nested structures.
	      if (aStack[length] === a) return bStack[length] === b;
	    }

	    // Add the first object to the stack of traversed objects.
	    aStack.push(a);
	    bStack.push(b);

	    // Recursively compare objects and arrays.
	    if (areArrays) {
	      // Compare array lengths to determine if a deep comparison is necessary.
	      length = a.length;
	      if (length !== b.length) return false;
	      // Deep compare the contents, ignoring non-numeric properties.
	      while (length--) {
	        if (!eq(a[length], b[length], aStack, bStack)) return false;
	      }
	    } else {
	      // Deep compare objects.
	      var keys = _.keys(a), key;
	      length = keys.length;
	      // Ensure that both objects contain the same number of properties before comparing deep equality.
	      if (_.keys(b).length !== length) return false;
	      while (length--) {
	        // Deep compare each member
	        key = keys[length];
	        if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
	      }
	    }
	    // Remove the first object from the stack of traversed objects.
	    aStack.pop();
	    bStack.pop();
	    return true;
	  };

	  // Perform a deep comparison to check if two objects are equal.
	  _.isEqual = function(a, b) {
	    return eq(a, b);
	  };

	  // Is a given array, string, or object empty?
	  // An "empty" object has no enumerable own-properties.
	  _.isEmpty = function(obj) {
	    if (obj == null) return true;
	    if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
	    return _.keys(obj).length === 0;
	  };

	  // Is a given value a DOM element?
	  _.isElement = function(obj) {
	    return !!(obj && obj.nodeType === 1);
	  };

	  // Is a given value an array?
	  // Delegates to ECMA5's native Array.isArray
	  _.isArray = nativeIsArray || function(obj) {
	    return toString.call(obj) === '[object Array]';
	  };

	  // Is a given variable an object?
	  _.isObject = function(obj) {
	    var type = typeof obj;
	    return type === 'function' || type === 'object' && !!obj;
	  };

	  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
	  _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
	    _['is' + name] = function(obj) {
	      return toString.call(obj) === '[object ' + name + ']';
	    };
	  });

	  // Define a fallback version of the method in browsers (ahem, IE < 9), where
	  // there isn't any inspectable "Arguments" type.
	  if (!_.isArguments(arguments)) {
	    _.isArguments = function(obj) {
	      return _.has(obj, 'callee');
	    };
	  }

	  // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
	  // IE 11 (#1621), and in Safari 8 (#1929).
	  if (typeof /./ != 'function' && typeof Int8Array != 'object') {
	    _.isFunction = function(obj) {
	      return typeof obj == 'function' || false;
	    };
	  }

	  // Is a given object a finite number?
	  _.isFinite = function(obj) {
	    return isFinite(obj) && !isNaN(parseFloat(obj));
	  };

	  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
	  _.isNaN = function(obj) {
	    return _.isNumber(obj) && obj !== +obj;
	  };

	  // Is a given value a boolean?
	  _.isBoolean = function(obj) {
	    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
	  };

	  // Is a given value equal to null?
	  _.isNull = function(obj) {
	    return obj === null;
	  };

	  // Is a given variable undefined?
	  _.isUndefined = function(obj) {
	    return obj === void 0;
	  };

	  // Shortcut function for checking if an object has a given property directly
	  // on itself (in other words, not on a prototype).
	  _.has = function(obj, key) {
	    return obj != null && hasOwnProperty.call(obj, key);
	  };

	  // Utility Functions
	  // -----------------

	  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
	  // previous owner. Returns a reference to the Underscore object.
	  _.noConflict = function() {
	    root._ = previousUnderscore;
	    return this;
	  };

	  // Keep the identity function around for default iteratees.
	  _.identity = function(value) {
	    return value;
	  };

	  // Predicate-generating functions. Often useful outside of Underscore.
	  _.constant = function(value) {
	    return function() {
	      return value;
	    };
	  };

	  _.noop = function(){};

	  _.property = property;

	  // Generates a function for a given object that returns a given property.
	  _.propertyOf = function(obj) {
	    return obj == null ? function(){} : function(key) {
	      return obj[key];
	    };
	  };

	  // Returns a predicate for checking whether an object has a given set of
	  // `key:value` pairs.
	  _.matcher = _.matches = function(attrs) {
	    attrs = _.extendOwn({}, attrs);
	    return function(obj) {
	      return _.isMatch(obj, attrs);
	    };
	  };

	  // Run a function **n** times.
	  _.times = function(n, iteratee, context) {
	    var accum = Array(Math.max(0, n));
	    iteratee = optimizeCb(iteratee, context, 1);
	    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
	    return accum;
	  };

	  // Return a random integer between min and max (inclusive).
	  _.random = function(min, max) {
	    if (max == null) {
	      max = min;
	      min = 0;
	    }
	    return min + Math.floor(Math.random() * (max - min + 1));
	  };

	  // A (possibly faster) way to get the current timestamp as an integer.
	  _.now = Date.now || function() {
	    return new Date().getTime();
	  };

	   // List of HTML entities for escaping.
	  var escapeMap = {
	    '&': '&amp;',
	    '<': '&lt;',
	    '>': '&gt;',
	    '"': '&quot;',
	    "'": '&#x27;',
	    '`': '&#x60;'
	  };
	  var unescapeMap = _.invert(escapeMap);

	  // Functions for escaping and unescaping strings to/from HTML interpolation.
	  var createEscaper = function(map) {
	    var escaper = function(match) {
	      return map[match];
	    };
	    // Regexes for identifying a key that needs to be escaped
	    var source = '(?:' + _.keys(map).join('|') + ')';
	    var testRegexp = RegExp(source);
	    var replaceRegexp = RegExp(source, 'g');
	    return function(string) {
	      string = string == null ? '' : '' + string;
	      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
	    };
	  };
	  _.escape = createEscaper(escapeMap);
	  _.unescape = createEscaper(unescapeMap);

	  // If the value of the named `property` is a function then invoke it with the
	  // `object` as context; otherwise, return it.
	  _.result = function(object, property, fallback) {
	    var value = object == null ? void 0 : object[property];
	    if (value === void 0) {
	      value = fallback;
	    }
	    return _.isFunction(value) ? value.call(object) : value;
	  };

	  // Generate a unique integer id (unique within the entire client session).
	  // Useful for temporary DOM ids.
	  var idCounter = 0;
	  _.uniqueId = function(prefix) {
	    var id = ++idCounter + '';
	    return prefix ? prefix + id : id;
	  };

	  // By default, Underscore uses ERB-style template delimiters, change the
	  // following template settings to use alternative delimiters.
	  _.templateSettings = {
	    evaluate    : /<%([\s\S]+?)%>/g,
	    interpolate : /<%=([\s\S]+?)%>/g,
	    escape      : /<%-([\s\S]+?)%>/g
	  };

	  // When customizing `templateSettings`, if you don't want to define an
	  // interpolation, evaluation or escaping regex, we need one that is
	  // guaranteed not to match.
	  var noMatch = /(.)^/;

	  // Certain characters need to be escaped so that they can be put into a
	  // string literal.
	  var escapes = {
	    "'":      "'",
	    '\\':     '\\',
	    '\r':     'r',
	    '\n':     'n',
	    '\u2028': 'u2028',
	    '\u2029': 'u2029'
	  };

	  var escaper = /\\|'|\r|\n|\u2028|\u2029/g;

	  var escapeChar = function(match) {
	    return '\\' + escapes[match];
	  };

	  // JavaScript micro-templating, similar to John Resig's implementation.
	  // Underscore templating handles arbitrary delimiters, preserves whitespace,
	  // and correctly escapes quotes within interpolated code.
	  // NB: `oldSettings` only exists for backwards compatibility.
	  _.template = function(text, settings, oldSettings) {
	    if (!settings && oldSettings) settings = oldSettings;
	    settings = _.defaults({}, settings, _.templateSettings);

	    // Combine delimiters into one regular expression via alternation.
	    var matcher = RegExp([
	      (settings.escape || noMatch).source,
	      (settings.interpolate || noMatch).source,
	      (settings.evaluate || noMatch).source
	    ].join('|') + '|$', 'g');

	    // Compile the template source, escaping string literals appropriately.
	    var index = 0;
	    var source = "__p+='";
	    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
	      source += text.slice(index, offset).replace(escaper, escapeChar);
	      index = offset + match.length;

	      if (escape) {
	        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
	      } else if (interpolate) {
	        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
	      } else if (evaluate) {
	        source += "';\n" + evaluate + "\n__p+='";
	      }

	      // Adobe VMs need the match returned to produce the correct offest.
	      return match;
	    });
	    source += "';\n";

	    // If a variable is not specified, place data values in local scope.
	    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';

	    source = "var __t,__p='',__j=Array.prototype.join," +
	      "print=function(){__p+=__j.call(arguments,'');};\n" +
	      source + 'return __p;\n';

	    try {
	      var render = new Function(settings.variable || 'obj', '_', source);
	    } catch (e) {
	      e.source = source;
	      throw e;
	    }

	    var template = function(data) {
	      return render.call(this, data, _);
	    };

	    // Provide the compiled source as a convenience for precompilation.
	    var argument = settings.variable || 'obj';
	    template.source = 'function(' + argument + '){\n' + source + '}';

	    return template;
	  };

	  // Add a "chain" function. Start chaining a wrapped Underscore object.
	  _.chain = function(obj) {
	    var instance = _(obj);
	    instance._chain = true;
	    return instance;
	  };

	  // OOP
	  // ---------------
	  // If Underscore is called as a function, it returns a wrapped object that
	  // can be used OO-style. This wrapper holds altered versions of all the
	  // underscore functions. Wrapped objects may be chained.

	  // Helper function to continue chaining intermediate results.
	  var result = function(instance, obj) {
	    return instance._chain ? _(obj).chain() : obj;
	  };

	  // Add your own custom functions to the Underscore object.
	  _.mixin = function(obj) {
	    _.each(_.functions(obj), function(name) {
	      var func = _[name] = obj[name];
	      _.prototype[name] = function() {
	        var args = [this._wrapped];
	        push.apply(args, arguments);
	        return result(this, func.apply(_, args));
	      };
	    });
	  };

	  // Add all of the Underscore functions to the wrapper object.
	  _.mixin(_);

	  // Add all mutator Array functions to the wrapper.
	  _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
	    var method = ArrayProto[name];
	    _.prototype[name] = function() {
	      var obj = this._wrapped;
	      method.apply(obj, arguments);
	      if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
	      return result(this, obj);
	    };
	  });

	  // Add all accessor Array functions to the wrapper.
	  _.each(['concat', 'join', 'slice'], function(name) {
	    var method = ArrayProto[name];
	    _.prototype[name] = function() {
	      return result(this, method.apply(this._wrapped, arguments));
	    };
	  });

	  // Extracts the result from a wrapped and chained object.
	  _.prototype.value = function() {
	    return this._wrapped;
	  };

	  // Provide unwrapping proxy for some methods used in engine operations
	  // such as arithmetic and JSON stringification.
	  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;

	  _.prototype.toString = function() {
	    return '' + this._wrapped;
	  };

	  // AMD registration happens at the end for compatibility with AMD loaders
	  // that may not enforce next-turn semantics on modules. Even though general
	  // practice for AMD registration is to be anonymous, underscore registers
	  // as a named module because, like jQuery, it is a base library that is
	  // popular enough to be bundled in a third party lib, but not be part of
	  // an AMD load request. Those cases could generate an error when an
	  // anonymous define() is called outside of a loader request.
	  if (true) {
	    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function() {
	      return _;
	    }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
	  }
	}.call(this));


/***/ },
/* 76 */,
/* 77 */
/***/ function(module, exports, __webpack_require__) {

	// style-loader: Adds some css to the DOM by adding a <style> tag

	// load the styles
	var content = __webpack_require__(78);
	if(typeof content === 'string') content = [[module.id, content, '']];
	// add the styles to the DOM
	var update = __webpack_require__(85)(content, {});
	if(content.locals) module.exports = content.locals;
	// Hot Module Replacement
	if(false) {
		// When the styles change, update the <style> tags
		if(!content.locals) {
			module.hot.accept("!!./../../../node_modules/css-loader/index.js!./../../../node_modules/stylus-loader/index.js!./build.styl", function() {
				var newContent = require("!!./../../../node_modules/css-loader/index.js!./../../../node_modules/stylus-loader/index.js!./build.styl");
				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
				update(newContent);
			});
		}
		// When the module is disposed, remove the <style> tags
		module.hot.dispose(function() { update(); });
	}

/***/ },
/* 78 */
/***/ function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(79)();
	// imports
	exports.i(__webpack_require__(80), "");
	exports.i(__webpack_require__(81), "");
	exports.i(__webpack_require__(82), "");
	exports.i(__webpack_require__(83), "");
	exports.i(__webpack_require__(84), "");

	// module
	exports.push([module.id, "select {\n  -webkit-appearance: none;\n  border: 0px none;\n  outline: none;\n  padding: 0;\n  background-color: #fff;\n}\ninput {\n  -webkit-appearance: none;\n  -webkit-font-smoothing: antialiased;\n  border: 0px none;\n  outline: none;\n  padding: 0;\n  height: 100%;\n}\nul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\ntextarea {\n  -webkit-appearance: none;\n  border: 0px none;\n  outline: none;\n  resize: none;\n  -webkit-font-smoothing: antialiased;\n}\n.timing-content {\n  padding-top: 43px;\n}\n@-webkit-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(180deg);\n    transform: rotate(180deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n.ball-rotate {\n  position: relative;\n}\n.ball-rotate > div {\n  background-color: #fff;\n  width: 15px;\n  height: 15px;\n  border-radius: 100%;\n  margin: 2px;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n  position: relative;\n}\n.ball-rotate > div:first-child {\n  -webkit-animation: rotate 1s 0s cubic-bezier(0.7, -0.13, 0.22, 0.86) infinite;\n  animation: rotate 1s 0s cubic-bezier(0.7, -0.13, 0.22, 0.86) infinite;\n}\n.ball-rotate > div:before,\n.ball-rotate > div:after {\n  background-color: #fff;\n  width: 15px;\n  height: 15px;\n  border-radius: 100%;\n  margin: 2px;\n  content: \"\";\n  position: absolute;\n  opacity: 0.8;\n}\n.ball-rotate > div:before {\n  top: 0px;\n  left: -28px;\n}\n.ball-rotate > div:after {\n  top: 0px;\n  left: 25px;\n}\n.ball-clip-rotate > div {\n  background-color: #fff;\n  width: 15px;\n  height: 15px;\n  border-radius: 100%;\n  margin: 2px;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n  border: 2px solid #fff;\n  border-bottom-color: transparent;\n  height: 25px;\n  width: 25px;\n  background: transparent !important;\n  display: inline-block;\n  -webkit-animation: rotate 0.75s 0s linear infinite;\n  animation: rotate 0.75s 0s linear infinite;\n}\n.ball-clip-rotate-pulse {\n  position: relative;\n  -webkit-transform: translateY(-15px);\n  -ms-transform: translateY(-15px);\n  transform: translateY(-15px);\n}\n.ball-clip-rotate-pulse > div {\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n  position: absolute;\n  top: 0px;\n  left: 0px;\n  border-radius: 100%;\n}\n.ball-clip-rotate-pulse > div:first-child {\n  background: #fff;\n  height: 16px;\n  width: 16px;\n  top: 7px;\n  left: -7px;\n  -webkit-animation: scale 1s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite;\n  animation: scale 1s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite;\n}\n.ball-clip-rotate-pulse > div:last-child {\n  position: absolute;\n  border: 2px solid #fff;\n  width: 30px;\n  height: 30px;\n  left: -16px;\n  top: -2px;\n  background: transparent;\n  border: 2px solid;\n  border-color: #fff transparent #fff transparent;\n  -webkit-animation: rotate 1s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite;\n  animation: rotate 1s 0s cubic-bezier(0.09, 0.57, 0.49, 0.9) infinite;\n  -webkit-animation-duration: 1s;\n  animation-duration: 1s;\n}\n.ball-clip-rotate-multiple {\n  position: relative;\n/* font-size: 22px; */\n  border-radius: 5px;\n  background-color: rgba(0,0,0,0.5);\n  max-width: 80%;\n  min-width: 124px;\n/* text-align: center; */\n  padding: 9px 11px;\n  color: #fff;\n  display: flex;\n  display: -webkit-box;\n  display: -webkit-flex;\n  align-items: center;\n  -webkit-align-items: center;\n  justify-content: center;\n  -webkit-justify-content: center;\n  position: relative;\n}\n.ball-clip-rotate-multiple > div {\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n  left: -20px;\n  top: -20px;\n  border: 2px solid #fff;\n  border-bottom-color: transparent;\n  border-top-color: transparent;\n  border-radius: 100%;\n  height: 35px;\n  width: 35px;\n  -webkit-animation: rotate 1s 0s ease-in-out infinite;\n  animation: rotate 1s 0s ease-in-out infinite;\n}\n.ball-clip-rotate-multiple > div:last-child {\n  display: inline-block;\n  top: 19px;\n  left: 0px;\n  bottom: 0px;\n  right: 0px;\n  width: 15px;\n  height: 15px;\n  -webkit-animation-duration: 0.5s;\n  animation-duration: 0.5s;\n  border-color: #fff transparent #fff transparent;\n  -webkit-animation-direction: reverse;\n  animation-direction: reverse;\n  position: absolute;\n  margin: 0px auto;\n}\n.loading-wrapper.active {\n  display: flex;\n  display: -webkit-box;\n  display: -webkit-flex;\n}\n.loading-wrapper {\n  position: fixed;\n  z-index: 9999;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  display: flex;\n  display: -webkit-box;\n  display: -webkit-flex;\n  justify-content: center;\n  -webkit-justify-content: center;\n  -webkit-align-items: center;\n  align-items: center;\n}\n.loading-wrapper img {\n  border-radius: 5px;\n  background-color: rgba(0,0,0,0.5);\n  max-width: 80%;\n  min-width: 118px;\n  text-align: center;\n  padding: 6px 11px;\n  color: #775c5c;\n  height: 48px;\n}\n@-moz-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(180deg);\n    transform: rotate(180deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n@-webkit-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(180deg);\n    transform: rotate(180deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(180deg);\n    transform: rotate(180deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n@keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  50% {\n    -webkit-transform: rotate(180deg);\n    transform: rotate(180deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n@-moz-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@-webkit-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@-o-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@-moz-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@-webkit-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@-o-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@-moz-keyframes scale {\n  30% {\n    -webkit-transform: scale(0.3);\n    transform: scale(0.3);\n  }\n  100% {\n    -webkit-transform: scale(1);\n    transform: scale(1);\n  }\n}\n@-webkit-keyframes scale {\n  30% {\n    -webkit-transform: scale(0.3);\n    transform: scale(0.3);\n  }\n  100% {\n    -webkit-transform: scale(1);\n    transform: scale(1);\n  }\n}\n@-o-keyframes scale {\n  30% {\n    -webkit-transform: scale(0.3);\n    transform: scale(0.3);\n  }\n  100% {\n    -webkit-transform: scale(1);\n    transform: scale(1);\n  }\n}\n@keyframes scale {\n  30% {\n    -webkit-transform: scale(0.3);\n    transform: scale(0.3);\n  }\n  100% {\n    -webkit-transform: scale(1);\n    transform: scale(1);\n  }\n}\n@-moz-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@-webkit-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@-o-keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n@keyframes rotate {\n  0% {\n    -webkit-transform: rotate(0deg) scale(1);\n    transform: rotate(0deg) scale(1);\n  }\n  50% {\n    -webkit-transform: rotate(180deg) scale(0.6);\n    transform: rotate(180deg) scale(0.6);\n  }\n  100% {\n    -webkit-transform: rotate(360deg) scale(1);\n    transform: rotate(360deg) scale(1);\n  }\n}\n", ""]);

	// exports


/***/ },
/* 79 */
/***/ function(module, exports) {

	/*
		MIT License http://www.opensource.org/licenses/mit-license.php
		Author Tobias Koppers @sokra
	*/
	// css base code, injected by the css-loader
	module.exports = function() {
		var list = [];

		// return the list of modules as css string
		list.toString = function toString() {
			var result = [];
			for(var i = 0; i < this.length; i++) {
				var item = this[i];
				if(item[2]) {
					result.push("@media " + item[2] + "{" + item[1] + "}");
				} else {
					result.push(item[1]);
				}
			}
			return result.join("");
		};

		// import a list of modules into the list
		list.i = function(modules, mediaQuery) {
			if(typeof modules === "string")
				modules = [[null, modules, ""]];
			var alreadyImportedModules = {};
			for(var i = 0; i < this.length; i++) {
				var id = this[i][0];
				if(typeof id === "number")
					alreadyImportedModules[id] = true;
			}
			for(i = 0; i < modules.length; i++) {
				var item = modules[i];
				// skip already imported module
				// this implementation is not 100% perfect for weird media query combinations
				//  when a module is imported multiple times with different media queries.
				//  I hope this will never occur (Hey this way we have smaller bundles)
				if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
					if(mediaQuery && !item[2]) {
						item[2] = mediaQuery;
					} else if(mediaQuery) {
						item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
					}
					list.push(item);
				}
			}
		};
		return list;
	};


/***/ },
/* 80 */
/***/ function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(79)();
	// imports


	// module
	exports.push([module.id, "\n.animated {\n  -webkit-animation-duration: .4s;\n  animation-duration: .4s;\n  -ms-animation-duration: .5s;\n  -webkit-animation-fill-mode: both;\n  animation-fill-mode: both;\n  &.1s {\n      -webkit-animation-duration: 5s;\n      animation-duration: 5s;\n  }\n}\n\n@-webkit-keyframes slideInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n\n  100% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n\n@keyframes slideInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-100%);\n    -ms-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n\n  100% {\n    -webkit-transform: translateY(0);\n    -ms-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n\n.slideInDown {\n  -webkit-animation-name: slideInDown;\n  animation-name: slideInDown;\n}\n\n@-webkit-keyframes slideInLeft {\n  0% {\n    /*opacity: 0;*/\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n\n\n\n@keyframes slideInLeft {\n  0% {\n    /*opacity: 0;*/\n    -webkit-transform: translateX(-100%);\n    -ms-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n\n  100% {\n    -webkit-transform: translateX(0);\n    -ms-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n\n.slideInLeft {\n  -webkit-animation-name: slideInLeft;\n  animation-name: slideInLeft;\n}\n\n@-webkit-keyframes slideInRight {\n  0% {\n    /*opacity: 0;*/\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n\n  100% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n\n@keyframes slideInRight {\n  0% {\n    /*opacity: 0;*/\n    -webkit-transform: translateX(100%);\n    -ms-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n\n  100% {\n    -webkit-transform: translateX(0);\n    -ms-transform: translateX(0);\n    transform: translateX(0);\n  }\n}\n\n.slideInRight {\n  -webkit-animation-name: slideInRight;\n  animation-name: slideInRight;\n}\n\n@-webkit-keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n\n  100% {\n    /*opacity: 0;*/\n    -webkit-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n\n@keyframes slideOutLeft {\n  0% {\n    -webkit-transform: translateX(0);\n    -ms-transform: translateX(0);\n    transform: translateX(0);\n  }\n\n  100% {\n    // opacity: 0;\n    -webkit-transform: translateX(-100%);\n    -ms-transform: translateX(-100%);\n    transform: translateX(-100%);\n  }\n}\n\n.slideOutLeft {\n  -webkit-animation-name: slideOutLeft;\n  animation-name: slideOutLeft;\n}\n\n@-webkit-keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    transform: translateX(0);\n  }\n\n  100% {\n    /*opacity: 0;*/\n    -webkit-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n\n@keyframes slideOutRight {\n  0% {\n    -webkit-transform: translateX(0);\n    -ms-transform: translateX(0);\n    transform: translateX(0);\n  }\n\n  100% {\n    // opacity: 0;\n    -webkit-transform: translateX(100%);\n    -ms-transform: translateX(100%);\n    transform: translateX(100%);\n  }\n}\n\n.slideOutRight {\n  -webkit-animation-name: slideOutRight;\n  animation-name: slideOutRight;\n}\n\n@-webkit-keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n\n@keyframes slideOutUp {\n  0% {\n    -webkit-transform: translateY(0);\n    -ms-transform: translateY(0);\n    transform: translateY(0);\n  }\n\n  100% {\n    opacity: 0;\n    -webkit-transform: translateY(-100%);\n    -ms-transform: translateY(-100%);\n    transform: translateY(-100%);\n  }\n}\n\n.slideOutUp {\n  -webkit-animation-name: slideOutUp;\n  animation-name: slideOutUp;\n}\n\n@-webkit-keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n\n  100% {\n    /*opacity: 0;*/\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n\n@keyframes slideInUp {\n  0% {\n    -webkit-transform: translateY(100%);\n    -ms-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n\n  100% {\n    /*opacity: 0;*/\n    -webkit-transform: translateY(0);\n    -ms-transform: translateY(0);\n    transform: translateY(0);\n  }\n}\n\n.slideInUp {\n  -webkit-animation-name: slideInUp;\n  animation-name: slideInUp;\n}\n\n@-webkit-keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    transform: translateY(0);\n  }\n\n  100% {\n    /*opacity: 0;*/\n    -webkit-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n\n@keyframes slideOutDown {\n  0% {\n    -webkit-transform: translateY(0);\n    -ms-transform: translateY(0);\n    transform: translateY(0);\n  }\n\n  100% {\n    /*opacity: 0;*/\n    -webkit-transform: translateY(100%);\n    -ms-transform: translateY(100%);\n    transform: translateY(100%);\n  }\n}\n\n.slideOutDown {\n  -webkit-animation-name: slideOutDown;\n  animation-name: slideOutDown;\n}\n", ""]);

	// exports


/***/ },
/* 81 */
/***/ function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(79)();
	// imports


	// module
	exports.push([module.id, "\n/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\nhtml\n{\n    font-family: sans-serif;\n\n    -webkit-text-size-adjust: 100%;\n}\n\nbody\n{\n    margin: 0;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary\n{\n    display: block;\n}\n\naudio,\ncanvas,\nprogress,\nvideo\n{\n    display: inline-block;\n\n    vertical-align: baseline;\n}\n\naudio:not([controls])\n{\n    display: none;\n\n    height: 0;\n}\n\n[hidden],\ntemplate\n{\n    display: none;\n}\n\na\n{\n    background: transparent;\n}\n\na:active,\na:hover\n{\n    outline: 0;\n}\n\nabbr[title]\n{\n    border-bottom: 1px dotted;\n}\n\nb,\nstrong\n{\n    font-weight: bold;\n}\n\ndfn\n{\n    font-style: italic;\n}\n\nh1\n{\n    font-size: 2em;\n\n    margin: .67em 0;\n}\n\nmark\n{\n    color: #000;\n    background: #ff0;\n}\n\nsmall\n{\n    font-size: 80%;\n}\n\nsub,\nsup\n{\n    font-size: 75%;\n    line-height: 0;\n\n    position: relative;\n\n    vertical-align: baseline;\n}\n\nsup\n{\n    top: -.5em;\n}\n\nsub\n{\n    bottom: -.25em;\n}\n\nimg\n{\n    border: 0;\n}\n\nsvg:not(:root)\n{\n    overflow: hidden;\n}\n\nfigure\n{\n    margin: 1em 40px;\n}\n\nhr\n{\n    box-sizing: content-box;\n    height: 0;\n}\n\npre\n{\n    overflow: auto;\n}\n\ncode,\nkbd,\npre,\nsamp\n{\n    font-family: monospace, monospace;\n    font-size: 1em;\n}\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea\n{\n    font: inherit;\n\n    margin: 0;\n\n    color: inherit;\n}\n\nbutton\n{\n    overflow: visible;\n}\n\nbutton,\nselect\n{\n    text-transform: none;\n}\n\nbutton,\nhtml input[type='button'],\ninput[type='reset'],\ninput[type='submit']\n{\n    cursor: pointer;\n\n    -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled]\n{\n    cursor: default;\n}\n\ninput\n{\n    line-height: normal;\n}\n\ninput[type='checkbox'],\ninput[type='radio']\n{\n    box-sizing: border-box;\n    padding: 0;\n}\n\ninput[type='number']::-webkit-inner-spin-button,\ninput[type='number']::-webkit-outer-spin-button\n{\n    height: auto;\n}\n\ninput[type='search']\n{\n    -webkit-box-sizing: content-box;\n            box-sizing: content-box;\n\n    -webkit-appearance: textfield;\n}\n\ninput[type='search']::-webkit-search-cancel-button,\ninput[type='search']::-webkit-search-decoration\n{\n    -webkit-appearance: none;\n}\n\nfieldset\n{\n    margin: 0 2px;\n    padding: .35em .625em .75em;\n\n    border: 1px solid #c0c0c0;\n}\n\nlegend\n{\n    padding: 0;\n\n    border: 0;\n}\n\ntextarea\n{\n    overflow: auto;\n}\n\noptgroup\n{\n    font-weight: bold;\n}\n\ntable\n{\n    border-spacing: 0;\n    border-collapse: collapse;\n}\n\ntd,\nth\n{\n    padding: 0;\n}\n\n*\n{\n    -webkit-box-sizing: border-box;\n            box-sizing: border-box;\n\n    /*-webkit-user-select: none;*/\n\n    outline: none;\n\n    -webkit-tap-highlight-color: transparent;\n    -webkit-tap-highlight-color: transparent;\n}\n\nbody\n{\n    font-family: 'Helvetica Neue', Helvetica, sans-serif;\n    font-size: 17px;\n    line-height: 21px;\n\n    color: #000;\n    background-color: #F2F3F4;\n\n    -webkit-overflow-scrolling: touch;\n}\n\na\n{\n    text-decoration: none;\n\n    color: #007aff;\n}\na:active\n{\n    color: #0062cc;\n}\n\n.PageView {\n width: 100%;\n min-height: 100%;\n background-color: #F2F3F4;\n position: absolute;;\n z-index: 10;\n -webkit-overflow-scrolling: touch\n}\n", ""]);

	// exports


/***/ },
/* 82 */
/***/ function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(79)();
	// imports


	// module
	exports.push([module.id, "\n\n.mui-scroll-wrapper\n{\n    position: absolute;\n    /*z-index: 2;*/\n    top: 0;\n    bottom: 0;\n    left: 0;\n\n    overflow: hidden;\n\n    width: 100%;\n}\n\n.mui-scroll\n{\n    position: absolute;\n    /*z-index: 1;*/\n\n    width: 100%;\n\n    -webkit-transform: translateZ(0);\n            transform: translateZ(0);\n}\n\n.mui-scrollbar\n{\n    position: absolute;\n    z-index: 9998;\n\n    overflow: hidden;\n\n    -webkit-transition: 500ms;\n            transition: 500ms;\n    transform: translateZ(0px);\n    pointer-events: none;\n\n    opacity: 0;\n}\n\n.mui-scrollbar-vertical\n{\n    top: 0;\n    right: 1px;\n    bottom: 2px;\n\n    width: 4px;\n}\n.mui-scrollbar-vertical .mui-scrollbar-indicator\n{\n    width: 100%;\n}\n\n.mui-scrollbar-horizontal\n{\n    right: 2px;\n    bottom: 0;\n    left: 2px;\n\n    height: 4px;\n}\n.mui-scrollbar-horizontal .mui-scrollbar-indicator\n{\n    height: 100%;\n}\n\n.mui-scrollbar-indicator\n{\n    position: absolute;\n\n    display: block;\n\n    box-sizing: border-box;\n\n    -webkit-transition: .01s cubic-bezier(.1, .57, .1, 1);\n            transition: .01s cubic-bezier(.1, .57, .1, 1);\n    transform: translate(0px, 0px) translateZ(0px);\n\n    border: 1px solid rgba(255, 255, 255, .80196);\n    border-radius: 2px;\n    background: rgba(0, 0, 0, .39804);\n}\n", ""]);

	// exports


/***/ },
/* 83 */
/***/ function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(79)();
	// imports


	// module
	exports.push([module.id, ".mui-toast-container\n{\n    position: fixed;\n    z-index: 9999;\n\n\n    -webkit-transition: opacity .8s;\n            transition: opacity .8s;\n\n    opacity: 0;\n\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    display: flex;\n    display:-webkit-box;\n    display: -webkit-flex;\n    justify-content: center;\n    -webkit-justify-content: center;\n    align-items: center;\n    -webkit-align-items: center;\n}\n.mui-toast-container.mui-active\n{\n    opacity: 1;\n}\n\n.mui-toast-message\n{\n  font-size: 14px;\n  border-radius: 5px;\n  background-color: rgba(0, 0, 0, 0.5);\n  max-width: 80%;\n  min-width: 124px;\n  text-align: center;\n  padding: 9px 11px;\n  color: white;\n}\n", ""]);

	// exports


/***/ },
/* 84 */
/***/ function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(79)();
	// imports


	// module
	exports.push([module.id, ".mui-dtpicker {\n\tposition: fixed;\n\tleft: 0px;\n\twidth: 100%;\n\tz-index: 999999;\n\tbackground-color: white;\n\tborder-top: solid 1px #ccc;\n\tbox-shadow: 0px -5px 7px 0px rgba(0, 0, 0, 0.1);\n\t-webkit-transition: .3s;\n\tbottom: 0px;\n\t-webkit-transform: translateY(300px);\n}\n.mui-dtpicker.mui-active {\n\t-webkit-transform: translateY(0px);\n}\n/*用于将 html body 禁止滚动条*/\n\n.mui-dtpicker-active-for-page {\n\toverflow: hidden !important;\n}\n.mui-android-5-1 .mui-dtpicker {\n\tbottom: -300px;\n\t-webkit-transition-property: bottom;\n\t-webkit-transform: none;\n}\n.mui-android-5-1 .mui-dtpicker.mui-active {\n\tbottom: 0px;\n\t-webkit-transition-property: bottom;\n\t-webkit-transform: none;\n}\n.mui-dtpicker-header {\n\tpadding: 7px;\n\tfont-size: 14px;\n\tbackground: #F0F4F6;\n\n}\n.mui-dtpicker-header span {\n\tfont-size: 14px;\n\tpadding: 5px 10px;\n\tcolor: #292F33;\n  display: inline-block;\n}\n.mui-dtpicker-header span:first-child {\n\tpadding-right: 25px;\n}\n.mui-dtpicker-header span:last-child {\n\tfloat: right;\n\tcolor: #1496f2;\n\tpadding-left: 25px;\n}\n.mui-dtpicker-body {\n\tposition: relative;\n\twidth: 100%;\n\theight: 173px;\n\tbackground: white;\n\t/*border-top: solid 1px #eee;\n\tbackground-color: #fff;*/\n}\n.mui-ios .mui-dtpicker-body {\n\t-webkit-perspective: 1200px;\n\tperspective: 1200px;\n\t-webkit-transform-style: preserve-3d;\n\ttransform-style: preserve-3d;\n}\n.mui-dtpicker-title h5 {\n\tdisplay: inline-block;\n\twidth: 20%;\n\tmargin: 0px;\n\tpadding: 8px;\n\ttext-align: center;\n\tborder-top: solid 1px #ddd;\n\tbackground-color: #f0f0f0;\n\tborder-bottom: solid 1px #ccc;\n}\n.mui-dtpicker .mui-picker {\n\twidth: 20%;\n\theight: 100%;\n\tmargin: 0px;\n\tfloat: left;\n\tborder: none;\n}\n\n/**\n * 选择列表插件\n * varstion 2.0.0\n * by Houfeng\n * Houfeng@DCloud.io\n */\n\n.mui-picker {\n    background-color: white;\n    position: relative;\n    height: 200px;\n    overflow: hidden;\n    border: solid 1px rgba(0, 0, 0, 0.1);\n    -webkit-user-select: none;\n    user-select: none;\n    box-sizing: border-box;\n}\n.mui-picker-inner {\n    box-sizing: border-box;\n    position: relative;\n    width: 100%;\n    height: 100%;\n    overflow: hidden;\n    -webkit-mask-box-image: -webkit-linear-gradient(bottom, transparent, transparent 5%, #fff 20%, #fff 80%, transparent 95%, transparent);\n    -webkit-mask-box-image: linear-gradient(top, transparent, transparent 5%, #fff 20%, #fff 80%, transparent 95%, transparent);\n}\n.mui-pciker-list,\n.mui-pciker-rule {\n    box-sizing: border-box;\n    padding: 0px;\n    margin: 0px;\n    width: 100%;\n    height: 46px;\n    line-height: 46px;\n    position: absolute;\n    left: 0px;\n    top: 50%;\n    margin-top: -18px;\n}\n.mui-pciker-rule-bg {\n    z-index: 0;\n    /*background-color: #cfd5da;*/\n}\n.mui-pciker-rule-ft {\n    z-index: 2;\n    border-top: solid 1px #eeeeee;\n    border-bottom: solid 1px #eeeeee;\n    /*-webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);*/\n    /*box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1);*/\n}\n.mui-pciker-list {\n    z-index: 1;\n    -webkit-transform-style: preserve-3d;\n    transform-style: preserve-3d;\n    -webkit-transform: perspective(1000px) rotateY(0deg) rotateX(0deg);\n    transform: perspective(1000px) rotateY(0deg) rotateX(0deg);\n}\n.mui-pciker-list li {\n    width: 100%;\n    height: 100%;\n    position: absolute;\n    text-align: center;\n    vertical-align: middle;\n    -webkit-backface-visibility: hidden;\n    backface-visibility: hidden;\n    overflow: hidden;\n    box-sizing: border-box;\n    font-size: 15px;\n    font-family: \"Helvetica Neue\", \"Helvetica\", \"Arial\", \"sans-serif\";\n    color: #8899A6;\n    padding: 0px 8px;\n    white-space: nowrap;\n    -webkit-text-overflow: ellipsis;\n    text-overflow: ellipsis;\n    overflow: hidden;\n    cursor: default;\n    visibility: hidden;\n}\n.mui-pciker-list li.highlight,\n.mui-pciker-list li.visible {\n    visibility: visible;\n}\n.mui-pciker-list li.highlight {\n    color: #292F33;\n}\n\n\n.selector-mask-pic{\n\twidth: 100%;\n  height: 100%;\n  position: fixed;\n  background: rgba(0, 0, 0, 0.5);\n  opacity: 0;\n  z-index: 99999;\n  -webkit-transition: opacity 0.3s;\n}\n\n.selector-mask-pic.active{\n  opacity: 1;\n}\n", ""]);

	// exports


/***/ },
/* 85 */
/***/ function(module, exports, __webpack_require__) {

	/*
		MIT License http://www.opensource.org/licenses/mit-license.php
		Author Tobias Koppers @sokra
	*/
	var stylesInDom = {},
		memoize = function(fn) {
			var memo;
			return function () {
				if (typeof memo === "undefined") memo = fn.apply(this, arguments);
				return memo;
			};
		},
		isOldIE = memoize(function() {
			return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
		}),
		getHeadElement = memoize(function () {
			return document.head || document.getElementsByTagName("head")[0];
		}),
		singletonElement = null,
		singletonCounter = 0,
		styleElementsInsertedAtTop = [];

	module.exports = function(list, options) {
		if(false) {
			if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
		}

		options = options || {};
		// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
		// tags it will allow on a page
		if (typeof options.singleton === "undefined") options.singleton = isOldIE();

		// By default, add <style> tags to the bottom of <head>.
		if (typeof options.insertAt === "undefined") options.insertAt = "bottom";

		var styles = listToStyles(list);
		addStylesToDom(styles, options);

		return function update(newList) {
			var mayRemove = [];
			for(var i = 0; i < styles.length; i++) {
				var item = styles[i];
				var domStyle = stylesInDom[item.id];
				domStyle.refs--;
				mayRemove.push(domStyle);
			}
			if(newList) {
				var newStyles = listToStyles(newList);
				addStylesToDom(newStyles, options);
			}
			for(var i = 0; i < mayRemove.length; i++) {
				var domStyle = mayRemove[i];
				if(domStyle.refs === 0) {
					for(var j = 0; j < domStyle.parts.length; j++)
						domStyle.parts[j]();
					delete stylesInDom[domStyle.id];
				}
			}
		};
	}

	function addStylesToDom(styles, options) {
		for(var i = 0; i < styles.length; i++) {
			var item = styles[i];
			var domStyle = stylesInDom[item.id];
			if(domStyle) {
				domStyle.refs++;
				for(var j = 0; j < domStyle.parts.length; j++) {
					domStyle.parts[j](item.parts[j]);
				}
				for(; j < item.parts.length; j++) {
					domStyle.parts.push(addStyle(item.parts[j], options));
				}
			} else {
				var parts = [];
				for(var j = 0; j < item.parts.length; j++) {
					parts.push(addStyle(item.parts[j], options));
				}
				stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
			}
		}
	}

	function listToStyles(list) {
		var styles = [];
		var newStyles = {};
		for(var i = 0; i < list.length; i++) {
			var item = list[i];
			var id = item[0];
			var css = item[1];
			var media = item[2];
			var sourceMap = item[3];
			var part = {css: css, media: media, sourceMap: sourceMap};
			if(!newStyles[id])
				styles.push(newStyles[id] = {id: id, parts: [part]});
			else
				newStyles[id].parts.push(part);
		}
		return styles;
	}

	function insertStyleElement(options, styleElement) {
		var head = getHeadElement();
		var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];
		if (options.insertAt === "top") {
			if(!lastStyleElementInsertedAtTop) {
				head.insertBefore(styleElement, head.firstChild);
			} else if(lastStyleElementInsertedAtTop.nextSibling) {
				head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);
			} else {
				head.appendChild(styleElement);
			}
			styleElementsInsertedAtTop.push(styleElement);
		} else if (options.insertAt === "bottom") {
			head.appendChild(styleElement);
		} else {
			throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
		}
	}

	function removeStyleElement(styleElement) {
		styleElement.parentNode.removeChild(styleElement);
		var idx = styleElementsInsertedAtTop.indexOf(styleElement);
		if(idx >= 0) {
			styleElementsInsertedAtTop.splice(idx, 1);
		}
	}

	function createStyleElement(options) {
		var styleElement = document.createElement("style");
		styleElement.type = "text/css";
		insertStyleElement(options, styleElement);
		return styleElement;
	}

	function createLinkElement(options) {
		var linkElement = document.createElement("link");
		linkElement.rel = "stylesheet";
		insertStyleElement(options, linkElement);
		return linkElement;
	}

	function addStyle(obj, options) {
		var styleElement, update, remove;

		if (options.singleton) {
			var styleIndex = singletonCounter++;
			styleElement = singletonElement || (singletonElement = createStyleElement(options));
			update = applyToSingletonTag.bind(null, styleElement, styleIndex, false);
			remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);
		} else if(obj.sourceMap &&
			typeof URL === "function" &&
			typeof URL.createObjectURL === "function" &&
			typeof URL.revokeObjectURL === "function" &&
			typeof Blob === "function" &&
			typeof btoa === "function") {
			styleElement = createLinkElement(options);
			update = updateLink.bind(null, styleElement);
			remove = function() {
				removeStyleElement(styleElement);
				if(styleElement.href)
					URL.revokeObjectURL(styleElement.href);
			};
		} else {
			styleElement = createStyleElement(options);
			update = applyToTag.bind(null, styleElement);
			remove = function() {
				removeStyleElement(styleElement);
			};
		}

		update(obj);

		return function updateStyle(newObj) {
			if(newObj) {
				if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)
					return;
				update(obj = newObj);
			} else {
				remove();
			}
		};
	}

	var replaceText = (function () {
		var textStore = [];

		return function (index, replacement) {
			textStore[index] = replacement;
			return textStore.filter(Boolean).join('\n');
		};
	})();

	function applyToSingletonTag(styleElement, index, remove, obj) {
		var css = remove ? "" : obj.css;

		if (styleElement.styleSheet) {
			styleElement.styleSheet.cssText = replaceText(index, css);
		} else {
			var cssNode = document.createTextNode(css);
			var childNodes = styleElement.childNodes;
			if (childNodes[index]) styleElement.removeChild(childNodes[index]);
			if (childNodes.length) {
				styleElement.insertBefore(cssNode, childNodes[index]);
			} else {
				styleElement.appendChild(cssNode);
			}
		}
	}

	function applyToTag(styleElement, obj) {
		var css = obj.css;
		var media = obj.media;

		if(media) {
			styleElement.setAttribute("media", media)
		}

		if(styleElement.styleSheet) {
			styleElement.styleSheet.cssText = css;
		} else {
			while(styleElement.firstChild) {
				styleElement.removeChild(styleElement.firstChild);
			}
			styleElement.appendChild(document.createTextNode(css));
		}
	}

	function updateLink(linkElement, obj) {
		var css = obj.css;
		var sourceMap = obj.sourceMap;

		if(sourceMap) {
			// http://stackoverflow.com/a/26603875
			css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
		}

		var blob = new Blob([css], { type: "text/css" });

		var oldSrc = linkElement.href;

		linkElement.href = URL.createObjectURL(blob);

		if(oldSrc)
			URL.revokeObjectURL(oldSrc);
	}


/***/ },
/* 86 */
/***/ function(module, exports) {

	/* Zepto v1.1.6 - zepto event ajax form ie - zeptojs.com/license */

	var Zepto = (function() {
	  var undefined, key, $, classList, emptyArray = [], slice = emptyArray.slice, filter = emptyArray.filter,
	    document = window.document,
	    elementDisplay = {}, classCache = {},
	    cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 },
	    fragmentRE = /^\s*<(\w+|!)[^>]*>/,
	    singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
	    tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
	    rootNodeRE = /^(?:body|html)$/i,
	    capitalRE = /([A-Z])/g,

	    // special attributes that should be get/set via method calls
	    methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],

	    adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ],
	    table = document.createElement('table'),
	    tableRow = document.createElement('tr'),
	    containers = {
	      'tr': document.createElement('tbody'),
	      'tbody': table, 'thead': table, 'tfoot': table,
	      'td': tableRow, 'th': tableRow,
	      '*': document.createElement('div')
	    },
	    readyRE = /complete|loaded|interactive/,
	    simpleSelectorRE = /^[\w-]*$/,
	    class2type = {},
	    toString = class2type.toString,
	    zepto = {},
	    camelize, uniq,
	    tempParent = document.createElement('div'),
	    propMap = {
	      'tabindex': 'tabIndex',
	      'readonly': 'readOnly',
	      'for': 'htmlFor',
	      'class': 'className',
	      'maxlength': 'maxLength',
	      'cellspacing': 'cellSpacing',
	      'cellpadding': 'cellPadding',
	      'rowspan': 'rowSpan',
	      'colspan': 'colSpan',
	      'usemap': 'useMap',
	      'frameborder': 'frameBorder',
	      'contenteditable': 'contentEditable'
	    },
	    isArray = Array.isArray ||
	      function(object){ return object instanceof Array }

	  zepto.matches = function(element, selector) {
	    if (!selector || !element || element.nodeType !== 1) return false
	    var matchesSelector = element.webkitMatchesSelector || element.mozMatchesSelector ||
	                          element.oMatchesSelector || element.matchesSelector
	    if (matchesSelector) return matchesSelector.call(element, selector)
	    // fall back to performing a selector:
	    var match, parent = element.parentNode, temp = !parent
	    if (temp) (parent = tempParent).appendChild(element)
	    match = ~zepto.qsa(parent, selector).indexOf(element)
	    temp && tempParent.removeChild(element)
	    return match
	  }

	  function type(obj) {
	    return obj == null ? String(obj) :
	      class2type[toString.call(obj)] || "object"
	  }

	  function isFunction(value) { return type(value) == "function" }
	  function isWindow(obj)     { return obj != null && obj == obj.window }
	  function isDocument(obj)   { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }
	  function isObject(obj)     { return type(obj) == "object" }
	  function isPlainObject(obj) {
	    return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype
	  }
	  function likeArray(obj) { return typeof obj.length == 'number' }

	  function compact(array) { return filter.call(array, function(item){ return item != null }) }
	  function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array }
	  camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) }
	  function dasherize(str) {
	    return str.replace(/::/g, '/')
	           .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
	           .replace(/([a-z\d])([A-Z])/g, '$1_$2')
	           .replace(/_/g, '-')
	           .toLowerCase()
	  }
	  uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) }

	  function classRE(name) {
	    return name in classCache ?
	      classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)'))
	  }

	  function maybeAddPx(name, value) {
	    return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value
	  }

	  function defaultDisplay(nodeName) {
	    var element, display
	    if (!elementDisplay[nodeName]) {
	      element = document.createElement(nodeName)
	      document.body.appendChild(element)
	      display = getComputedStyle(element, '').getPropertyValue("display")
	      element.parentNode.removeChild(element)
	      display == "none" && (display = "block")
	      elementDisplay[nodeName] = display
	    }
	    return elementDisplay[nodeName]
	  }

	  function children(element) {
	    return 'children' in element ?
	      slice.call(element.children) :
	      $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node })
	  }

	  // `$.zepto.fragment` takes a html string and an optional tag name
	  // to generate DOM nodes nodes from the given html string.
	  // The generated DOM nodes are returned as an array.
	  // This function can be overriden in plugins for example to make
	  // it compatible with browsers that don't support the DOM fully.
	  zepto.fragment = function(html, name, properties) {
	    var dom, nodes, container

	    // A special case optimization for a single tag
	    if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))

	    if (!dom) {
	      if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>")
	      if (name === undefined) name = fragmentRE.test(html) && RegExp.$1
	      if (!(name in containers)) name = '*'

	      container = containers[name]
	      container.innerHTML = '' + html
	      dom = $.each(slice.call(container.childNodes), function(){
	        container.removeChild(this)
	      })
	    }

	    if (isPlainObject(properties)) {
	      nodes = $(dom)
	      $.each(properties, function(key, value) {
	        if (methodAttributes.indexOf(key) > -1) nodes[key](value)
	        else nodes.attr(key, value)
	      })
	    }

	    return dom
	  }

	  // `$.zepto.Z` swaps out the prototype of the given `dom` array
	  // of nodes with `$.fn` and thus supplying all the Zepto functions
	  // to the array. Note that `__proto__` is not supported on Internet
	  // Explorer. This method can be overriden in plugins.
	  zepto.Z = function(dom, selector) {
	    dom = dom || []
	    dom.__proto__ = $.fn
	    dom.selector = selector || ''
	    return dom
	  }

	  // `$.zepto.isZ` should return `true` if the given object is a Zepto
	  // collection. This method can be overriden in plugins.
	  zepto.isZ = function(object) {
	    return object instanceof zepto.Z
	  }

	  // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and
	  // takes a CSS selector and an optional context (and handles various
	  // special cases).
	  // This method can be overriden in plugins.
	  zepto.init = function(selector, context) {
	    var dom
	    // If nothing given, return an empty Zepto collection
	    if (!selector) return zepto.Z()
	    // Optimize for string selectors
	    else if (typeof selector == 'string') {
	      selector = selector.trim()
	      // If it's a html fragment, create nodes from it
	      // Note: In both Chrome 21 and Firefox 15, DOM error 12
	      // is thrown if the fragment doesn't begin with <
	      if (selector[0] == '<' && fragmentRE.test(selector))
	        dom = zepto.fragment(selector, RegExp.$1, context), selector = null
	      // If there's a context, create a collection on that context first, and select
	      // nodes from there
	      else if (context !== undefined) return $(context).find(selector)
	      // If it's a CSS selector, use it to select nodes.
	      else dom = zepto.qsa(document, selector)
	    }
	    // If a function is given, call it when the DOM is ready
	    else if (isFunction(selector)) return $(document).ready(selector)
	    // If a Zepto collection is given, just return it
	    else if (zepto.isZ(selector)) return selector
	    else {
	      // normalize array if an array of nodes is given
	      if (isArray(selector)) dom = compact(selector)
	      // Wrap DOM nodes.
	      else if (isObject(selector))
	        dom = [selector], selector = null
	      // If it's a html fragment, create nodes from it
	      else if (fragmentRE.test(selector))
	        dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null
	      // If there's a context, create a collection on that context first, and select
	      // nodes from there
	      else if (context !== undefined) return $(context).find(selector)
	      // And last but no least, if it's a CSS selector, use it to select nodes.
	      else dom = zepto.qsa(document, selector)
	    }
	    // create a new Zepto collection from the nodes found
	    return zepto.Z(dom, selector)
	  }

	  // `$` will be the base `Zepto` object. When calling this
	  // function just call `$.zepto.init, which makes the implementation
	  // details of selecting nodes and creating Zepto collections
	  // patchable in plugins.
	  $ = function(selector, context){
	    return zepto.init(selector, context)
	  }

	  function extend(target, source, deep) {
	    for (key in source)
	      if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
	        if (isPlainObject(source[key]) && !isPlainObject(target[key]))
	          target[key] = {}
	        if (isArray(source[key]) && !isArray(target[key]))
	          target[key] = []
	        extend(target[key], source[key], deep)
	      }
	      else if (source[key] !== undefined) target[key] = source[key]
	  }

	  // Copy all but undefined properties from one or more
	  // objects to the `target` object.
	  $.extend = function(target){
	    var deep, args = slice.call(arguments, 1)
	    if (typeof target == 'boolean') {
	      deep = target
	      target = args.shift()
	    }
	    args.forEach(function(arg){ extend(target, arg, deep) })
	    return target
	  }

	  // `$.zepto.qsa` is Zepto's CSS selector implementation which
	  // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.
	  // This method can be overriden in plugins.
	  zepto.qsa = function(element, selector){
	    var found,
	        maybeID = selector[0] == '#',
	        maybeClass = !maybeID && selector[0] == '.',
	        nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked
	        isSimple = simpleSelectorRE.test(nameOnly)
	    return (isDocument(element) && isSimple && maybeID) ?
	      ( (found = element.getElementById(nameOnly)) ? [found] : [] ) :
	      (element.nodeType !== 1 && element.nodeType !== 9) ? [] :
	      slice.call(
	        isSimple && !maybeID ?
	          maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class
	          element.getElementsByTagName(selector) : // Or a tag
	          element.querySelectorAll(selector) // Or it's not simple, and we need to query all
	      )
	  }

	  function filtered(nodes, selector) {
	    return selector == null ? $(nodes) : $(nodes).filter(selector)
	  }

	  $.contains = document.documentElement.contains ?
	    function(parent, node) {
	      return parent !== node && parent.contains(node)
	    } :
	    function(parent, node) {
	      while (node && (node = node.parentNode))
	        if (node === parent) return true
	      return false
	    }

	  function funcArg(context, arg, idx, payload) {
	    return isFunction(arg) ? arg.call(context, idx, payload) : arg
	  }

	  function setAttribute(node, name, value) {
	    value == null ? node.removeAttribute(name) : node.setAttribute(name, value)
	  }

	  // access className property while respecting SVGAnimatedString
	  function className(node, value){
	    var klass = node.className || '',
	        svg   = klass && klass.baseVal !== undefined

	    if (value === undefined) return svg ? klass.baseVal : klass
	    svg ? (klass.baseVal = value) : (node.className = value)
	  }

	  // "true"  => true
	  // "false" => false
	  // "null"  => null
	  // "42"    => 42
	  // "42.5"  => 42.5
	  // "08"    => "08"
	  // JSON    => parse if valid
	  // String  => self
	  function deserializeValue(value) {
	    try {
	      return value ?
	        value == "true" ||
	        ( value == "false" ? false :
	          value == "null" ? null :
	          +value + "" == value ? +value :
	          /^[\[\{]/.test(value) ? $.parseJSON(value) :
	          value )
	        : value
	    } catch(e) {
	      return value
	    }
	  }

	  $.type = type
	  $.isFunction = isFunction
	  $.isWindow = isWindow
	  $.isArray = isArray
	  $.isPlainObject = isPlainObject

	  $.isEmptyObject = function(obj) {
	    var name
	    for (name in obj) return false
	    return true
	  }

	  $.inArray = function(elem, array, i){
	    return emptyArray.indexOf.call(array, elem, i)
	  }

	  $.camelCase = camelize
	  $.trim = function(str) {
	    return str == null ? "" : String.prototype.trim.call(str)
	  }

	  // plugin compatibility
	  $.uuid = 0
	  $.support = { }
	  $.expr = { }

	  $.map = function(elements, callback){
	    var value, values = [], i, key
	    if (likeArray(elements))
	      for (i = 0; i < elements.length; i++) {
	        value = callback(elements[i], i)
	        if (value != null) values.push(value)
	      }
	    else
	      for (key in elements) {
	        value = callback(elements[key], key)
	        if (value != null) values.push(value)
	      }
	    return flatten(values)
	  }

	  $.each = function(elements, callback){
	    var i, key
	    if (likeArray(elements)) {
	      for (i = 0; i < elements.length; i++)
	        if (callback.call(elements[i], i, elements[i]) === false) return elements
	    } else {
	      for (key in elements)
	        if (callback.call(elements[key], key, elements[key]) === false) return elements
	    }

	    return elements
	  }

	  $.grep = function(elements, callback){
	    return filter.call(elements, callback)
	  }

	  if (window.JSON) $.parseJSON = JSON.parse

	  // Populate the class2type map
	  $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
	    class2type[ "[object " + name + "]" ] = name.toLowerCase()
	  })

	  // Define methods that will be available on all
	  // Zepto collections
	  $.fn = {
	    // Because a collection acts like an array
	    // copy over these useful array functions.
	    forEach: emptyArray.forEach,
	    reduce: emptyArray.reduce,
	    push: emptyArray.push,
	    sort: emptyArray.sort,
	    indexOf: emptyArray.indexOf,
	    concat: emptyArray.concat,

	    // `map` and `slice` in the jQuery API work differently
	    // from their array counterparts
	    map: function(fn){
	      return $($.map(this, function(el, i){ return fn.call(el, i, el) }))
	    },
	    slice: function(){
	      return $(slice.apply(this, arguments))
	    },

	    ready: function(callback){
	      // need to check if document.body exists for IE as that browser reports
	      // document ready when it hasn't yet created the body element
	      if (readyRE.test(document.readyState) && document.body) callback($)
	      else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false)
	      return this
	    },
	    get: function(idx){
	      return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length]
	    },
	    toArray: function(){ return this.get() },
	    size: function(){
	      return this.length
	    },
	    remove: function(){
	      return this.each(function(){
	        if (this.parentNode != null)
	          this.parentNode.removeChild(this)
	      })
	    },
	    each: function(callback){
	      emptyArray.every.call(this, function(el, idx){
	        return callback.call(el, idx, el) !== false
	      })
	      return this
	    },
	    filter: function(selector){
	      if (isFunction(selector)) return this.not(this.not(selector))
	      return $(filter.call(this, function(element){
	        return zepto.matches(element, selector)
	      }))
	    },
	    add: function(selector,context){
	      return $(uniq(this.concat($(selector,context))))
	    },
	    is: function(selector){
	      return this.length > 0 && zepto.matches(this[0], selector)
	    },
	    not: function(selector){
	      var nodes=[]
	      if (isFunction(selector) && selector.call !== undefined)
	        this.each(function(idx){
	          if (!selector.call(this,idx)) nodes.push(this)
	        })
	      else {
	        var excludes = typeof selector == 'string' ? this.filter(selector) :
	          (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)
	        this.forEach(function(el){
	          if (excludes.indexOf(el) < 0) nodes.push(el)
	        })
	      }
	      return $(nodes)
	    },
	    has: function(selector){
	      return this.filter(function(){
	        return isObject(selector) ?
	          $.contains(this, selector) :
	          $(this).find(selector).size()
	      })
	    },
	    eq: function(idx){
	      return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1)
	    },
	    first: function(){
	      var el = this[0]
	      return el && !isObject(el) ? el : $(el)
	    },
	    last: function(){
	      var el = this[this.length - 1]
	      return el && !isObject(el) ? el : $(el)
	    },
	    find: function(selector){
	      var result, $this = this
	      if (!selector) result = $()
	      else if (typeof selector == 'object')
	        result = $(selector).filter(function(){
	          var node = this
	          return emptyArray.some.call($this, function(parent){
	            return $.contains(parent, node)
	          })
	        })
	      else if (this.length == 1) result = $(zepto.qsa(this[0], selector))
	      else result = this.map(function(){ return zepto.qsa(this, selector) })
	      return result
	    },
	    closest: function(selector, context){
	      var node = this[0], collection = false
	      if (typeof selector == 'object') collection = $(selector)
	      while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))
	        node = node !== context && !isDocument(node) && node.parentNode
	      return $(node)
	    },
	    parents: function(selector){
	      var ancestors = [], nodes = this
	      while (nodes.length > 0)
	        nodes = $.map(nodes, function(node){
	          if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {
	            ancestors.push(node)
	            return node
	          }
	        })
	      return filtered(ancestors, selector)
	    },
	    parent: function(selector){
	      return filtered(uniq(this.pluck('parentNode')), selector)
	    },
	    children: function(selector){
	      return filtered(this.map(function(){ return children(this) }), selector)
	    },
	    contents: function() {
	      return this.map(function() { return slice.call(this.childNodes) })
	    },
	    siblings: function(selector){
	      return filtered(this.map(function(i, el){
	        return filter.call(children(el.parentNode), function(child){ return child!==el })
	      }), selector)
	    },
	    empty: function(){
	      return this.each(function(){ this.innerHTML = '' })
	    },
	    // `pluck` is borrowed from Prototype.js
	    pluck: function(property){
	      return $.map(this, function(el){ return el[property] })
	    },
	    show: function(){
	      return this.each(function(){
	        this.style.display == "none" && (this.style.display = '')
	        if (getComputedStyle(this, '').getPropertyValue("display") == "none")
	          this.style.display = defaultDisplay(this.nodeName)
	      })
	    },
	    replaceWith: function(newContent){
	      return this.before(newContent).remove()
	    },
	    wrap: function(structure){
	      var func = isFunction(structure)
	      if (this[0] && !func)
	        var dom   = $(structure).get(0),
	            clone = dom.parentNode || this.length > 1

	      return this.each(function(index){
	        $(this).wrapAll(
	          func ? structure.call(this, index) :
	            clone ? dom.cloneNode(true) : dom
	        )
	      })
	    },
	    wrapAll: function(structure){
	      if (this[0]) {
	        $(this[0]).before(structure = $(structure))
	        var children
	        // drill down to the inmost element
	        while ((children = structure.children()).length) structure = children.first()
	        $(structure).append(this)
	      }
	      return this
	    },
	    wrapInner: function(structure){
	      var func = isFunction(structure)
	      return this.each(function(index){
	        var self = $(this), contents = self.contents(),
	            dom  = func ? structure.call(this, index) : structure
	        contents.length ? contents.wrapAll(dom) : self.append(dom)
	      })
	    },
	    unwrap: function(){
	      this.parent().each(function(){
	        $(this).replaceWith($(this).children())
	      })
	      return this
	    },
	    clone: function(){
	      return this.map(function(){ return this.cloneNode(true) })
	    },
	    hide: function(){
	      return this.css("display", "none")
	    },
	    toggle: function(setting){
	      return this.each(function(){
	        var el = $(this)
	        ;(setting === undefined ? el.css("display") == "none" : setting) ? el.show() : el.hide()
	      })
	    },
	    prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') },
	    next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') },
	    html: function(html){
	      return 0 in arguments ?
	        this.each(function(idx){
	          var originHtml = this.innerHTML
	          $(this).empty().append( funcArg(this, html, idx, originHtml) )
	        }) :
	        (0 in this ? this[0].innerHTML : null)
	    },
	    text: function(text){
	      return 0 in arguments ?
	        this.each(function(idx){
	          var newText = funcArg(this, text, idx, this.textContent)
	          this.textContent = newText == null ? '' : ''+newText
	        }) :
	        (0 in this ? this[0].textContent : null)
	    },
	    attr: function(name, value){
	      var result
	      return (typeof name == 'string' && !(1 in arguments)) ?
	        (!this.length || this[0].nodeType !== 1 ? undefined :
	          (!(result = this[0].getAttribute(name)) && name in this[0]) ? this[0][name] : result
	        ) :
	        this.each(function(idx){
	          if (this.nodeType !== 1) return
	          if (isObject(name)) for (key in name) setAttribute(this, key, name[key])
	          else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))
	        })
	    },
	    removeAttr: function(name){
	      return this.each(function(){ this.nodeType === 1 && name.split(' ').forEach(function(attribute){
	        setAttribute(this, attribute)
	      }, this)})
	    },
	    prop: function(name, value){
	      name = propMap[name] || name
	      return (1 in arguments) ?
	        this.each(function(idx){
	          this[name] = funcArg(this, value, idx, this[name])
	        }) :
	        (this[0] && this[0][name])
	    },
	    data: function(name, value){
	      var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase()

	      var data = (1 in arguments) ?
	        this.attr(attrName, value) :
	        this.attr(attrName)

	      return data !== null ? deserializeValue(data) : undefined
	    },
	    val: function(value){
	      return 0 in arguments ?
	        this.each(function(idx){
	          this.value = funcArg(this, value, idx, this.value)
	        }) :
	        (this[0] && (this[0].multiple ?
	           $(this[0]).find('option').filter(function(){ return this.selected }).pluck('value') :
	           this[0].value)
	        )
	    },
	    offset: function(coordinates){
	      if (coordinates) return this.each(function(index){
	        var $this = $(this),
	            coords = funcArg(this, coordinates, index, $this.offset()),
	            parentOffset = $this.offsetParent().offset(),
	            props = {
	              top:  coords.top  - parentOffset.top,
	              left: coords.left - parentOffset.left
	            }

	        if ($this.css('position') == 'static') props['position'] = 'relative'
	        $this.css(props)
	      })
	      if (!this.length) return null
	      var obj = this[0].getBoundingClientRect()
	      return {
	        left: obj.left + window.pageXOffset,
	        top: obj.top + window.pageYOffset,
	        width: Math.round(obj.width),
	        height: Math.round(obj.height)
	      }
	    },
	    css: function(property, value){
	      if (arguments.length < 2) {
	        var computedStyle, element = this[0]
	        if(!element) return
	        computedStyle = getComputedStyle(element, '')
	        if (typeof property == 'string')
	          return element.style[camelize(property)] || computedStyle.getPropertyValue(property)
	        else if (isArray(property)) {
	          var props = {}
	          $.each(property, function(_, prop){
	            props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop))
	          })
	          return props
	        }
	      }

	      var css = ''
	      if (type(property) == 'string') {
	        if (!value && value !== 0)
	          this.each(function(){ this.style.removeProperty(dasherize(property)) })
	        else
	          css = dasherize(property) + ":" + maybeAddPx(property, value)
	      } else {
	        for (key in property)
	          if (!property[key] && property[key] !== 0)
	            this.each(function(){ this.style.removeProperty(dasherize(key)) })
	          else
	            css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'
	      }

	      return this.each(function(){ this.style.cssText += ';' + css })
	    },
	    index: function(element){
	      return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0])
	    },
	    hasClass: function(name){
	      if (!name) return false
	      return emptyArray.some.call(this, function(el){
	        return this.test(className(el))
	      }, classRE(name))
	    },
	    addClass: function(name){
	      if (!name) return this
	      return this.each(function(idx){
	        if (!('className' in this)) return
	        classList = []
	        var cls = className(this), newName = funcArg(this, name, idx, cls)
	        newName.split(/\s+/g).forEach(function(klass){
	          if (!$(this).hasClass(klass)) classList.push(klass)
	        }, this)
	        classList.length && className(this, cls + (cls ? " " : "") + classList.join(" "))
	      })
	    },
	    removeClass: function(name){
	      return this.each(function(idx){
	        if (!('className' in this)) return
	        if (name === undefined) return className(this, '')
	        classList = className(this)
	        funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass){
	          classList = classList.replace(classRE(klass), " ")
	        })
	        className(this, classList.trim())
	      })
	    },
	    toggleClass: function(name, when){
	      if (!name) return this
	      return this.each(function(idx){
	        var $this = $(this), names = funcArg(this, name, idx, className(this))
	        names.split(/\s+/g).forEach(function(klass){
	          (when === undefined ? !$this.hasClass(klass) : when) ?
	            $this.addClass(klass) : $this.removeClass(klass)
	        })
	      })
	    },
	    scrollTop: function(value){
	      if (!this.length) return
	      var hasScrollTop = 'scrollTop' in this[0]
	      if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset
	      return this.each(hasScrollTop ?
	        function(){ this.scrollTop = value } :
	        function(){ this.scrollTo(this.scrollX, value) })
	    },
	    scrollLeft: function(value){
	      if (!this.length) return
	      var hasScrollLeft = 'scrollLeft' in this[0]
	      if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset
	      return this.each(hasScrollLeft ?
	        function(){ this.scrollLeft = value } :
	        function(){ this.scrollTo(value, this.scrollY) })
	    },
	    position: function() {
	      if (!this.length) return

	      var elem = this[0],
	        // Get *real* offsetParent
	        offsetParent = this.offsetParent(),
	        // Get correct offsets
	        offset       = this.offset(),
	        parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset()

	      // Subtract element margins
	      // note: when an element has margin: auto the offsetLeft and marginLeft
	      // are the same in Safari causing offset.left to incorrectly be 0
	      offset.top  -= parseFloat( $(elem).css('margin-top') ) || 0
	      offset.left -= parseFloat( $(elem).css('margin-left') ) || 0

	      // Add offsetParent borders
	      parentOffset.top  += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0
	      parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0

	      // Subtract the two offsets
	      return {
	        top:  offset.top  - parentOffset.top,
	        left: offset.left - parentOffset.left
	      }
	    },
	    offsetParent: function() {
	      return this.map(function(){
	        var parent = this.offsetParent || document.body
	        while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css("position") == "static")
	          parent = parent.offsetParent
	        return parent
	      })
	    }
	  }

	  // for now
	  $.fn.detach = $.fn.remove

	  // Generate the `width` and `height` functions
	  ;['width', 'height'].forEach(function(dimension){
	    var dimensionProperty =
	      dimension.replace(/./, function(m){ return m[0].toUpperCase() })

	    $.fn[dimension] = function(value){
	      var offset, el = this[0]
	      if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] :
	        isDocument(el) ? el.documentElement['scroll' + dimensionProperty] :
	        (offset = this.offset()) && offset[dimension]
	      else return this.each(function(idx){
	        el = $(this)
	        el.css(dimension, funcArg(this, value, idx, el[dimension]()))
	      })
	    }
	  })

	  function traverseNode(node, fun) {
	    fun(node)
	    for (var i = 0, len = node.childNodes.length; i < len; i++)
	      traverseNode(node.childNodes[i], fun)
	  }

	  // Generate the `after`, `prepend`, `before`, `append`,
	  // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.
	  adjacencyOperators.forEach(function(operator, operatorIndex) {
	    var inside = operatorIndex % 2 //=> prepend, append

	    $.fn[operator] = function(){
	      // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings
	      var argType, nodes = $.map(arguments, function(arg) {
	            argType = type(arg)
	            return argType == "object" || argType == "array" || arg == null ?
	              arg : zepto.fragment(arg)
	          }),
	          parent, copyByClone = this.length > 1
	      if (nodes.length < 1) return this

	      return this.each(function(_, target){
	        parent = inside ? target : target.parentNode

	        // convert all methods to a "before" operation
	        target = operatorIndex == 0 ? target.nextSibling :
	                 operatorIndex == 1 ? target.firstChild :
	                 operatorIndex == 2 ? target :
	                 null

	        var parentInDocument = $.contains(document.documentElement, parent)

	        nodes.forEach(function(node){
	          if (copyByClone) node = node.cloneNode(true)
	          else if (!parent) return $(node).remove()

	          parent.insertBefore(node, target)
	          if (parentInDocument) traverseNode(node, function(el){
	            if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' &&
	               (!el.type || el.type === 'text/javascript') && !el.src)
	              window['eval'].call(window, el.innerHTML)
	          })
	        })
	      })
	    }

	    // after    => insertAfter
	    // prepend  => prependTo
	    // before   => insertBefore
	    // append   => appendTo
	    $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){
	      $(html)[operator](this)
	      return this
	    }
	  })

	  zepto.Z.prototype = $.fn

	  // Export internal API functions in the `$.zepto` namespace
	  zepto.uniq = uniq
	  zepto.deserializeValue = deserializeValue
	  $.zepto = zepto

	  return $
	})()

	window.Zepto = Zepto
	window.$ === undefined && (window.$ = Zepto)

	;(function($){
	  var _zid = 1, undefined,
	      slice = Array.prototype.slice,
	      isFunction = $.isFunction,
	      isString = function(obj){ return typeof obj == 'string' },
	      handlers = {},
	      specialEvents={},
	      focusinSupported = 'onfocusin' in window,
	      focus = { focus: 'focusin', blur: 'focusout' },
	      hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' }

	  specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'

	  function zid(element) {
	    return element._zid || (element._zid = _zid++)
	  }
	  function findHandlers(element, event, fn, selector) {
	    event = parse(event)
	    if (event.ns) var matcher = matcherFor(event.ns)
	    return (handlers[zid(element)] || []).filter(function(handler) {
	      return handler
	        && (!event.e  || handler.e == event.e)
	        && (!event.ns || matcher.test(handler.ns))
	        && (!fn       || zid(handler.fn) === zid(fn))
	        && (!selector || handler.sel == selector)
	    })
	  }
	  function parse(event) {
	    var parts = ('' + event).split('.')
	    return {e: parts[0], ns: parts.slice(1).sort().join(' ')}
	  }
	  function matcherFor(ns) {
	    return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)')
	  }

	  function eventCapture(handler, captureSetting) {
	    return handler.del &&
	      (!focusinSupported && (handler.e in focus)) ||
	      !!captureSetting
	  }

	  function realEvent(type) {
	    return hover[type] || (focusinSupported && focus[type]) || type
	  }

	  function add(element, events, fn, data, selector, delegator, capture){
	    var id = zid(element), set = (handlers[id] || (handlers[id] = []))
	    events.split(/\s/).forEach(function(event){
	      if (event == 'ready') return $(document).ready(fn)
	      var handler   = parse(event)
	      handler.fn    = fn
	      handler.sel   = selector
	      // emulate mouseenter, mouseleave
	      if (handler.e in hover) fn = function(e){
	        var related = e.relatedTarget
	        if (!related || (related !== this && !$.contains(this, related)))
	          return handler.fn.apply(this, arguments)
	      }
	      handler.del   = delegator
	      var callback  = delegator || fn
	      handler.proxy = function(e){
	        e = compatible(e)
	        if (e.isImmediatePropagationStopped()) return
	        e.data = data
	        var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args))
	        if (result === false) e.preventDefault(), e.stopPropagation()
	        return result
	      }
	      handler.i = set.length
	      set.push(handler)
	      if ('addEventListener' in element)
	        element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))
	    })
	  }
	  function remove(element, events, fn, selector, capture){
	    var id = zid(element)
	    ;(events || '').split(/\s/).forEach(function(event){
	      findHandlers(element, event, fn, selector).forEach(function(handler){
	        delete handlers[id][handler.i]
	      if ('removeEventListener' in element)
	        element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))
	      })
	    })
	  }

	  $.event = { add: add, remove: remove }

	  $.proxy = function(fn, context) {
	    var args = (2 in arguments) && slice.call(arguments, 2)
	    if (isFunction(fn)) {
	      var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) }
	      proxyFn._zid = zid(fn)
	      return proxyFn
	    } else if (isString(context)) {
	      if (args) {
	        args.unshift(fn[context], fn)
	        return $.proxy.apply(null, args)
	      } else {
	        return $.proxy(fn[context], fn)
	      }
	    } else {
	      throw new TypeError("expected function")
	    }
	  }

	  $.fn.bind = function(event, data, callback){
	    return this.on(event, data, callback)
	  }
	  $.fn.unbind = function(event, callback){
	    return this.off(event, callback)
	  }
	  $.fn.one = function(event, selector, data, callback){
	    return this.on(event, selector, data, callback, 1)
	  }

	  var returnTrue = function(){return true},
	      returnFalse = function(){return false},
	      ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$)/,
	      eventMethods = {
	        preventDefault: 'isDefaultPrevented',
	        stopImmediatePropagation: 'isImmediatePropagationStopped',
	        stopPropagation: 'isPropagationStopped'
	      }

	  function compatible(event, source) {
	    if (source || !event.isDefaultPrevented) {
	      source || (source = event)

	      $.each(eventMethods, function(name, predicate) {
	        var sourceMethod = source[name]
	        event[name] = function(){
	          this[predicate] = returnTrue
	          return sourceMethod && sourceMethod.apply(source, arguments)
	        }
	        event[predicate] = returnFalse
	      })

	      if (source.defaultPrevented !== undefined ? source.defaultPrevented :
	          'returnValue' in source ? source.returnValue === false :
	          source.getPreventDefault && source.getPreventDefault())
	        event.isDefaultPrevented = returnTrue
	    }
	    return event
	  }

	  function createProxy(event) {
	    var key, proxy = { originalEvent: event }
	    for (key in event)
	      if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key]

	    return compatible(proxy, event)
	  }

	  $.fn.delegate = function(selector, event, callback){
	    return this.on(event, selector, callback)
	  }
	  $.fn.undelegate = function(selector, event, callback){
	    return this.off(event, selector, callback)
	  }

	  $.fn.live = function(event, callback){
	    $(document.body).delegate(this.selector, event, callback)
	    return this
	  }
	  $.fn.die = function(event, callback){
	    $(document.body).undelegate(this.selector, event, callback)
	    return this
	  }

	  $.fn.on = function(event, selector, data, callback, one){
	    var autoRemove, delegator, $this = this
	    if (event && !isString(event)) {
	      $.each(event, function(type, fn){
	        $this.on(type, selector, data, fn, one)
	      })
	      return $this
	    }

	    if (!isString(selector) && !isFunction(callback) && callback !== false)
	      callback = data, data = selector, selector = undefined
	    if (isFunction(data) || data === false)
	      callback = data, data = undefined

	    if (callback === false) callback = returnFalse

	    return $this.each(function(_, element){
	      if (one) autoRemove = function(e){
	        remove(element, e.type, callback)
	        return callback.apply(this, arguments)
	      }

	      if (selector) delegator = function(e){
	        var evt, match = $(e.target).closest(selector, element).get(0)
	        if (match && match !== element) {
	          evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element})
	          return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)))
	        }
	      }

	      add(element, event, callback, data, selector, delegator || autoRemove)
	    })
	  }
	  $.fn.off = function(event, selector, callback){
	    var $this = this
	    if (event && !isString(event)) {
	      $.each(event, function(type, fn){
	        $this.off(type, selector, fn)
	      })
	      return $this
	    }

	    if (!isString(selector) && !isFunction(callback) && callback !== false)
	      callback = selector, selector = undefined

	    if (callback === false) callback = returnFalse

	    return $this.each(function(){
	      remove(this, event, callback, selector)
	    })
	  }

	  $.fn.trigger = function(event, args){
	    event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event)
	    event._args = args
	    return this.each(function(){
	      // handle focus(), blur() by calling them directly
	      if (event.type in focus && typeof this[event.type] == "function") this[event.type]()
	      // items in the collection might not be DOM elements
	      else if ('dispatchEvent' in this) this.dispatchEvent(event)
	      else $(this).triggerHandler(event, args)
	    })
	  }

	  // triggers event handlers on current element just as if an event occurred,
	  // doesn't trigger an actual event, doesn't bubble
	  $.fn.triggerHandler = function(event, args){
	    var e, result
	    this.each(function(i, element){
	      e = createProxy(isString(event) ? $.Event(event) : event)
	      e._args = args
	      e.target = element
	      $.each(findHandlers(element, event.type || event), function(i, handler){
	        result = handler.proxy(e)
	        if (e.isImmediatePropagationStopped()) return false
	      })
	    })
	    return result
	  }

	  // shortcut methods for `.bind(event, fn)` for each event type
	  ;('focusin focusout focus blur load resize scroll unload click dblclick '+
	  'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+
	  'change select keydown keypress keyup error').split(' ').forEach(function(event) {
	    $.fn[event] = function(callback) {
	      return (0 in arguments) ?
	        this.bind(event, callback) :
	        this.trigger(event)
	    }
	  })

	  $.Event = function(type, props) {
	    if (!isString(type)) props = type, type = props.type
	    var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true
	    if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name])
	    event.initEvent(type, bubbles, true)
	    return compatible(event)
	  }

	})(Zepto)

	;(function($){
	  var jsonpID = 0,
	      document = window.document,
	      key,
	      name,
	      rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
	      scriptTypeRE = /^(?:text|application)\/javascript/i,
	      xmlTypeRE = /^(?:text|application)\/xml/i,
	      jsonType = 'application/json',
	      htmlType = 'text/html',
	      blankRE = /^\s*$/,
	      originAnchor = document.createElement('a')

	  originAnchor.href = window.location.href

	  // trigger a custom event and return false if it was cancelled
	  function triggerAndReturn(context, eventName, data) {
	    var event = $.Event(eventName)
	    $(context).trigger(event, data)
	    return !event.isDefaultPrevented()
	  }

	  // trigger an Ajax "global" event
	  function triggerGlobal(settings, context, eventName, data) {
	    if (settings.global) return triggerAndReturn(context || document, eventName, data)
	  }

	  // Number of active Ajax requests
	  $.active = 0

	  function ajaxStart(settings) {
	    if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart')
	  }
	  function ajaxStop(settings) {
	    if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop')
	  }

	  // triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable
	  function ajaxBeforeSend(xhr, settings) {
	    var context = settings.context
	    if (settings.beforeSend.call(context, xhr, settings) === false ||
	        triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false)
	      return false

	    triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])
	  }
	  function ajaxSuccess(data, xhr, settings, deferred) {
	    var context = settings.context, status = 'success'
	    settings.success.call(context, data, status, xhr)
	    if (deferred) deferred.resolveWith(context, [data, status, xhr])
	    triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data])
	    ajaxComplete(status, xhr, settings)
	  }
	  // type: "timeout", "error", "abort", "parsererror"
	  function ajaxError(error, type, xhr, settings, deferred) {
	    var context = settings.context
	    settings.error.call(context, xhr, type, error)
	    if (deferred) deferred.rejectWith(context, [xhr, type, error])
	    triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type])
	    ajaxComplete(type, xhr, settings)
	  }
	  // status: "success", "notmodified", "error", "timeout", "abort", "parsererror"
	  function ajaxComplete(status, xhr, settings) {
	    var context = settings.context
	    settings.complete.call(context, xhr, status)
	    triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings])
	    ajaxStop(settings)
	  }

	  // Empty function, used as default callback
	  function empty() {}

	  $.ajaxJSONP = function(options, deferred){
	    if (!('type' in options)) return $.ajax(options)

	    var _callbackName = options.jsonpCallback,
	      callbackName = ($.isFunction(_callbackName) ?
	        _callbackName() : _callbackName) || ('jsonp' + (++jsonpID)),
	      script = document.createElement('script'),
	      originalCallback = window[callbackName],
	      responseData,
	      abort = function(errorType) {
	        $(script).triggerHandler('error', errorType || 'abort')
	      },
	      xhr = { abort: abort }, abortTimeout

	    if (deferred) deferred.promise(xhr)

	    $(script).on('load error', function(e, errorType){
	      clearTimeout(abortTimeout)
	      $(script).off().remove()

	      if (e.type == 'error' || !responseData) {
	        ajaxError(null, errorType || 'error', xhr, options, deferred)
	      } else {
	        ajaxSuccess(responseData[0], xhr, options, deferred)
	      }

	      window[callbackName] = originalCallback
	      if (responseData && $.isFunction(originalCallback))
	        originalCallback(responseData[0])

	      originalCallback = responseData = undefined
	    })

	    if (ajaxBeforeSend(xhr, options) === false) {
	      abort('abort')
	      return xhr
	    }

	    window[callbackName] = function(){
	      responseData = arguments
	    }

	    script.src = options.url.replace(/\?(.+)=\?/, '?$1=' + callbackName)
	    document.head.appendChild(script)

	    if (options.timeout > 0) abortTimeout = setTimeout(function(){
	      abort('timeout')
	    }, options.timeout)

	    return xhr
	  }

	  $.ajaxSettings = {
	    // Default type of request
	    type: 'GET',
	    // Callback that is executed before request
	    beforeSend: empty,
	    // Callback that is executed if the request succeeds
	    success: empty,
	    // Callback that is executed the the server drops error
	    error: empty,
	    // Callback that is executed on request complete (both: error and success)
	    complete: empty,
	    // The context for the callbacks
	    context: null,
	    // Whether to trigger "global" Ajax events
	    global: true,
	    // Transport
	    xhr: function () {
	      return new window.XMLHttpRequest()
	    },
	    // MIME types mapping
	    // IIS returns Javascript as "application/x-javascript"
	    accepts: {
	      script: 'text/javascript, application/javascript, application/x-javascript',
	      json:   jsonType,
	      xml:    'application/xml, text/xml',
	      html:   htmlType,
	      text:   'text/plain'
	    },
	    // Whether the request is to another domain
	    crossDomain: false,
	    // Default timeout
	    timeout: 0,
	    // Whether data should be serialized to string
	    processData: true,
	    // Whether the browser should be allowed to cache GET responses
	    cache: true
	  }

	  function mimeToDataType(mime) {
	    if (mime) mime = mime.split(';', 2)[0]
	    return mime && ( mime == htmlType ? 'html' :
	      mime == jsonType ? 'json' :
	      scriptTypeRE.test(mime) ? 'script' :
	      xmlTypeRE.test(mime) && 'xml' ) || 'text'
	  }

	  function appendQuery(url, query) {
	    if (query == '') return url
	    return (url + '&' + query).replace(/[&?]{1,2}/, '?')
	  }

	  // serialize payload and append it to the URL for GET requests
	  function serializeData(options) {
	    if (options.processData && options.data && $.type(options.data) != "string")
	      options.data = $.param(options.data, options.traditional)
	    if (options.data && (!options.type || options.type.toUpperCase() == 'GET'))
	      options.url = appendQuery(options.url, options.data), options.data = undefined
	  }

	  $.ajax = function(options){
	    var settings = $.extend({}, options || {}),
	        deferred = $.Deferred && $.Deferred(),
	        urlAnchor
	    for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]

	    ajaxStart(settings)

	    if (!settings.crossDomain) {
	      urlAnchor = document.createElement('a')
	      urlAnchor.href = settings.url
	      urlAnchor.href = urlAnchor.href
	      settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host)
	    }

	    if (!settings.url) settings.url = window.location.toString()
	    serializeData(settings)

	    var dataType = settings.dataType, hasPlaceholder = /\?.+=\?/.test(settings.url)
	    if (hasPlaceholder) dataType = 'jsonp'

	    if (settings.cache === false || (
	         (!options || options.cache !== true) &&
	         ('script' == dataType || 'jsonp' == dataType)
	        ))
	      settings.url = appendQuery(settings.url, '_=' + Date.now())

	    if ('jsonp' == dataType) {
	      if (!hasPlaceholder)
	        settings.url = appendQuery(settings.url,
	          settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?')
	      return $.ajaxJSONP(settings, deferred)
	    }

	    var mime = settings.accepts[dataType],
	        headers = { },
	        setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] },
	        protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol,
	        xhr = settings.xhr(),
	        nativeSetHeader = xhr.setRequestHeader,
	        abortTimeout

	    if (deferred) deferred.promise(xhr)

	    if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest')
	    setHeader('Accept', mime || '*/*')
	    if (mime = settings.mimeType || mime) {
	      if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0]
	      xhr.overrideMimeType && xhr.overrideMimeType(mime)
	    }
	    if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET'))
	      setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded')

	    if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name])
	    xhr.setRequestHeader = setHeader

	    xhr.onreadystatechange = function(){
	      if (xhr.readyState == 4) {
	        xhr.onreadystatechange = empty
	        clearTimeout(abortTimeout)
	        var result, error = false
	        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) {
	          dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'))
	          result = xhr.responseText

	          try {
	            // http://perfectionkills.com/global-eval-what-are-the-options/
	            if (dataType == 'script')    (1,eval)(result)
	            else if (dataType == 'xml')  result = xhr.responseXML
	            else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result)
	          } catch (e) { error = e }

	          if (error) ajaxError(error, 'parsererror', xhr, settings, deferred)
	          else ajaxSuccess(result, xhr, settings, deferred)
	        } else {
	          ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred)
	        }
	      }
	    }

	    if (ajaxBeforeSend(xhr, settings) === false) {
	      xhr.abort()
	      ajaxError(null, 'abort', xhr, settings, deferred)
	      return xhr
	    }

	    if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]

	    var async = 'async' in settings ? settings.async : true
	    xhr.open(settings.type, settings.url, async, settings.username, settings.password)

	    for (name in headers) nativeSetHeader.apply(xhr, headers[name])

	    if (settings.timeout > 0) abortTimeout = setTimeout(function(){
	        xhr.onreadystatechange = empty
	        xhr.abort()
	        ajaxError(null, 'timeout', xhr, settings, deferred)
	      }, settings.timeout)

	    // avoid sending empty string (#319)
	    xhr.send(settings.data ? settings.data : null)
	    return xhr
	  }

	  // handle optional data/success arguments
	  function parseArguments(url, data, success, dataType) {
	    if ($.isFunction(data)) dataType = success, success = data, data = undefined
	    if (!$.isFunction(success)) dataType = success, success = undefined
	    return {
	      url: url
	    , data: data
	    , success: success
	    , dataType: dataType
	    }
	  }

	  $.get = function(/* url, data, success, dataType */){
	    return $.ajax(parseArguments.apply(null, arguments))
	  }

	  $.post = function(/* url, data, success, dataType */){
	    var options = parseArguments.apply(null, arguments)
	    options.type = 'POST'
	    return $.ajax(options)
	  }

	  $.getJSON = function(/* url, data, success */){
	    var options = parseArguments.apply(null, arguments)
	    options.dataType = 'json'
	    return $.ajax(options)
	  }

	  $.fn.load = function(url, data, success){
	    if (!this.length) return this
	    var self = this, parts = url.split(/\s/), selector,
	        options = parseArguments(url, data, success),
	        callback = options.success
	    if (parts.length > 1) options.url = parts[0], selector = parts[1]
	    options.success = function(response){
	      self.html(selector ?
	        $('<div>').html(response.replace(rscript, "")).find(selector)
	        : response)
	      callback && callback.apply(self, arguments)
	    }
	    $.ajax(options)
	    return this
	  }

	  var escape = encodeURIComponent

	  function serialize(params, obj, traditional, scope){
	    var type, array = $.isArray(obj), hash = $.isPlainObject(obj)
	    $.each(obj, function(key, value) {
	      type = $.type(value)
	      if (scope) key = traditional ? scope :
	        scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']'
	      // handle data in serializeArray() format
	      if (!scope && array) params.add(value.name, value.value)
	      // recurse into nested objects
	      else if (type == "array" || (!traditional && type == "object"))
	        serialize(params, value, traditional, key)
	      else params.add(key, value)
	    })
	  }

	  $.param = function(obj, traditional){
	    var params = []
	    params.add = function(key, value) {
	      if ($.isFunction(value)) value = value()
	      if (value == null) value = ""
	      this.push(escape(key) + '=' + escape(value))
	    }
	    serialize(params, obj, traditional)
	    return params.join('&').replace(/%20/g, '+')
	  }
	})(Zepto)

	;(function($){
	  $.fn.serializeArray = function() {
	    var name, type, result = [],
	      add = function(value) {
	        if (value.forEach) return value.forEach(add)
	        result.push({ name: name, value: value })
	      }
	    if (this[0]) $.each(this[0].elements, function(_, field){
	      type = field.type, name = field.name
	      if (name && field.nodeName.toLowerCase() != 'fieldset' &&
	        !field.disabled && type != 'submit' && type != 'reset' && type != 'button' && type != 'file' &&
	        ((type != 'radio' && type != 'checkbox') || field.checked))
	          add($(field).val())
	    })
	    return result
	  }

	  $.fn.serialize = function(){
	    var result = []
	    this.serializeArray().forEach(function(elm){
	      result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value))
	    })
	    return result.join('&')
	  }

	  $.fn.submit = function(callback) {
	    if (0 in arguments) this.bind('submit', callback)
	    else if (this.length) {
	      var event = $.Event('submit')
	      this.eq(0).trigger(event)
	      if (!event.isDefaultPrevented()) this.get(0).submit()
	    }
	    return this
	  }

	})(Zepto)

	;(function($){
	  // __proto__ doesn't exist on IE<11, so redefine
	  // the Z function to use object extension instead
	  if (!('__proto__' in {})) {
	    $.extend($.zepto, {
	      Z: function(dom, selector){
	        dom = dom || []
	        $.extend(dom, $.fn)
	        dom.selector = selector || ''
	        dom.__Z = true
	        return dom
	      },
	      // this is a kludge but works
	      isZ: function(object){
	        return $.type(object) === 'array' && '__Z' in object
	      }
	    })
	  }

	  // getComputedStyle shouldn't freak out when called
	  // without a valid element as argument
	  try {
	    getComputedStyle(undefined)
	  } catch(e) {
	    var nativeGetComputedStyle = getComputedStyle;
	    window.getComputedStyle = function(element){
	      try {
	        return nativeGetComputedStyle(element)
	      } catch(e) {
	        return null
	      }
	    }
	  }
	})(Zepto)
	;


/***/ },
/* 87 */
/***/ function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';

	var _promise = __webpack_require__(88);

	var _promise2 = _interopRequireDefault(_promise);

	var _defineProperty = __webpack_require__(5);

	var _defineProperty2 = _interopRequireDefault(_defineProperty);

	var _getPrototypeOf = __webpack_require__(104);

	var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);

	var _setPrototypeOf = __webpack_require__(108);

	var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);

	var _typeof2 = __webpack_require__(22);

	var _typeof3 = _interopRequireDefault(_typeof2);

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	var rweb = function (document, undefined) {
		var $ = function $() {};
		var readyRE = /complete|loaded|interactive/;
		var idSelectorRE = /^#([\w-]+)$/;
		var classSelectorRE = /^\.([\w-]+)$/;
		var tagSelectorRE = /^[\w-]+$/;
		var translateRE = /translate(?:3d)?\((.+?)\)/;
		var translateMatrixRE = /matrix(3d)?\((.+?)\)/;

		var $ = function $(selector, context) {
			context = context || document;
			if (!selector) return wrap();
			if ((typeof selector === 'undefined' ? 'undefined' : (0, _typeof3.default)(selector)) === 'object') return wrap([selector], null);
			if (typeof selector === 'function') return $.ready(selector);
			if (typeof selector === 'string') {
				try {
					selector = selector.trim();
					if (idSelectorRE.test(selector)) {
						var found = document.getElementById(RegExp.$1);
						return wrap(found ? [found] : []);
					}
					return wrap($.qsa(selector, context), selector);
				} catch (e) {}
			}
			return wrap();
		};

		var wrap = function wrap(dom, selector) {
			dom = dom || [];
			(0, _setPrototypeOf2.default)(dom, $.fn);
			dom.selector = selector || '';
			return dom;
		};

		$.uuid = 0;

		$.data = {};
		/**
	  * extend(simple)
	  * @param {type} target
	  * @param {type} source
	  * @param {type} deep
	  * @returns {unresolved}
	  */
		$.extend = function () {
			//from jquery2
			var options,
			    name,
			    src,
			    copy,
			    copyIsArray,
			    clone,
			    target = arguments[0] || {},
			    i = 1,
			    length = arguments.length,
			    deep = false;

			if (typeof target === "boolean") {
				deep = target;

				target = arguments[i] || {};
				i++;
			}

			if ((typeof target === 'undefined' ? 'undefined' : (0, _typeof3.default)(target)) !== "object" && !$.isFunction(target)) {
				target = {};
			}

			if (i === length) {
				target = this;
				i--;
			}

			for (; i < length; i++) {
				if ((options = arguments[i]) != null) {
					for (name in options) {
						src = target[name];
						copy = options[name];

						if (target === copy) {
							continue;
						}

						if (deep && copy && ($.isPlainObject(copy) || (copyIsArray = $.isArray(copy)))) {
							if (copyIsArray) {
								copyIsArray = false;
								clone = src && $.isArray(src) ? src : [];
							} else {
								clone = src && $.isPlainObject(src) ? src : {};
							}

							target[name] = $.extend(deep, clone, copy);
						} else if (copy !== undefined) {
							target[name] = copy;
						}
					}
				}
			}

			return target;
		};
		/**
	  * rweb noop(function)
	  */
		$.noop = function () {};
		/**
	  * rweb slice(array)
	  */
		$.slice = [].slice;
		/**
	  * rweb filter(array)
	  */
		$.filter = [].filter;

		$.type = function (obj) {
			return obj == null ? String(obj) : class2type[{}.toString.call(obj)] || "object";
		};
		/**
	  * rweb isArray
	  */
		$.isArray = Array.isArray || function (object) {
			return object instanceof Array;
		};
		/**
	  * rweb isWindow(需考虑obj为undefined的情况)
	  */
		$.isWindow = function (obj) {
			return obj != null && obj === obj.window;
		};
		/**
	  * rweb isObject
	  */
		$.isObject = function (obj) {
			return $.type(obj) === "object";
		};
		/**
	  * rweb isPlainObject
	  */
		$.isPlainObject = function (obj) {
			return $.isObject(obj) && !$.isWindow(obj) && (0, _getPrototypeOf2.default)(obj) === Object.prototype;
		};
		/**
	  * rweb isEmptyObject
	  * @param {Object} o
	  */
		$.isEmptyObject = function (o) {
			for (var p in o) {
				if (p !== undefined) {
					return false;
				}
			}
			return true;
		};
		/**
	  * rweb isFunction
	  */
		$.isFunction = function (value) {
			return $.type(value) === "function";
		};
		/**
	  * rweb querySelectorAll
	  * @param {type} selector
	  * @param {type} context
	  * @returns {Array}
	  */
		$.qsa = function (selector, context) {
			context = context || document;
			return $.slice.call(classSelectorRE.test(selector) ? context.getElementsByClassName(RegExp.$1) : tagSelectorRE.test(selector) ? context.getElementsByTagName(selector) : context.querySelectorAll(selector));
		};
		/**
	  * ready(DOMContentLoaded)
	  * @param {type} callback
	  * @returns {_L6.$}
	  */
		$.ready = function (callback) {
			if (readyRE.test(document.readyState)) {
				callback($);
			} else {
				document.addEventListener('DOMContentLoaded', function () {
					callback($);
				}, false);
			}
			return this;
		};
		/**
	  * each
	  * @param {type} elements
	  * @param {type} callback
	  * @returns {_L8.$}
	  */
		$.each = function (elements, callback, hasOwnProperty) {
			if (!elements) {
				return this;
			}
			if (typeof elements.length === 'number') {
				[].every.call(elements, function (el, idx) {
					return callback.call(el, idx, el) !== false;
				});
			} else {
				for (var key in elements) {
					if (hasOwnProperty) {
						if (elements.hasOwnProperty(key)) {
							if (callback.call(elements[key], key, elements[key]) === false) return elements;
						}
					} else {
						if (callback.call(elements[key], key, elements[key]) === false) return elements;
					}
				}
			}
			return this;
		};
		$.focus = function (element) {
			if ($.os.ios) {
				setTimeout(function () {
					element.focus();
				}, 10);
			} else {
				element.focus();
			}
		};
		/**
	  * trigger event
	  * @param {type} element
	  * @param {type} eventType
	  * @param {type} eventData
	  * @returns {_L8.$}
	  */
		$.trigger = function (element, eventType, eventData) {
			element.dispatchEvent(new CustomEvent(eventType, {
				detail: eventData,
				bubbles: true,
				cancelable: true
			}));
			return this;
		};
		/**
	  * getStyles
	  * @param {type} element
	  * @param {type} property
	  * @returns {styles}
	  */
		$.getStyles = function (element, property) {
			var styles = element.ownerDocument.defaultView.getComputedStyle(element, null);
			if (property) {
				return styles.getPropertyValue(property) || styles[property];
			}
			return styles;
		};
		/**
	  * parseTranslate
	  * @param {type} translateString
	  * @param {type} position
	  * @returns {Object}
	  */
		$.parseTranslate = function (translateString, position) {
			var result = translateString.match(translateRE || '');
			if (!result || !result[1]) {
				result = ['', '0,0,0'];
			}
			result = result[1].split(",");
			result = {
				x: parseFloat(result[0]),
				y: parseFloat(result[1]),
				z: parseFloat(result[2])
			};
			if (position && result.hasOwnProperty(position)) {
				return result[position];
			}
			return result;
		};
		/**
	  * parseTranslateMatrix
	  * @param {type} translateString
	  * @param {type} position
	  * @returns {Object}
	  */
		$.parseTranslateMatrix = function (translateString, position) {
			var matrix = translateString.match(translateMatrixRE);
			var is3D = matrix && matrix[1];
			if (matrix) {
				matrix = matrix[2].split(",");
				if (is3D === "3d") matrix = matrix.slice(12, 15);else {
					matrix.push(0);
					matrix = matrix.slice(4, 7);
				}
			} else {
				matrix = [0, 0, 0];
			}
			var result = {
				x: parseFloat(matrix[0]),
				y: parseFloat(matrix[1]),
				z: parseFloat(matrix[2])
			};
			if (position && result.hasOwnProperty(position)) {
				return result[position];
			}
			return result;
		};
		$.hooks = {};
		$.addAction = function (type, hook) {
			var hooks = $.hooks[type];
			if (!hooks) {
				hooks = [];
			}
			hook.index = hook.index || 1000;
			hooks.push(hook);
			hooks.sort(function (a, b) {
				return a.index - b.index;
			});
			$.hooks[type] = hooks;
			return $.hooks[type];
		};
		$.doAction = function (type, callback) {
			if ($.isFunction(callback)) {
				//指定了callback
				$.each($.hooks[type], callback);
			} else {
				//未指定callback，直接执行
				$.each($.hooks[type], function (index, hook) {
					return !hook.handle();
				});
			}
		};
		/**
	  * setTimeout封装
	  * @param {Object} fn
	  * @param {Object} when
	  * @param {Object} context
	  * @param {Object} data
	  */
		$.later = function (fn, when, context, data) {
			when = when || 0;
			var m = fn;
			var d = data;
			var f;
			var r;

			if (typeof fn === 'string') {
				m = context[fn];
			}

			f = function f() {
				m.apply(context, $.isArray(d) ? d : [d]);
			};

			r = setTimeout(f, when);

			return {
				id: r,
				cancel: function cancel() {
					clearTimeout(r);
				}
			};
		};
		$.now = Date.now || function () {
			return +new Date();
		};
		var class2type = {};
		$.each(['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Object', 'Error'], function (i, name) {
			class2type["[object " + name + "]"] = name.toLowerCase();
		});
		if (window.JSON) {
			$.parseJSON = JSON.parse;
		}
		/**
	  * $.fn
	  */
		$.fn = {
			each: function each(callback) {
				[].every.call(this, function (el, idx) {
					return callback.call(el, idx, el) !== false;
				});
				return this;
			}
		};

		/**
	  * 兼容 AMD 模块
	  **/
		if (true) {
			!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {
				return $;
			}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		}

		return $;
	}(document); /**
	              * 核心JS
	              */


	window.R = rweb;
	window.rweb = rweb;

	/**
	 * fixed trim
	 * @param {type} undefined
	 * @returns {undefined}
	 */
	(function (undefined) {
		if (String.prototype.trim === undefined) {
			// fix for iOS 3.2
			String.prototype.trim = function () {
				return this.replace(/^\s+|\s+$/g, '');
			};
		}
		Object.setPrototypeOf = _setPrototypeOf2.default || function (obj, proto) {
			obj['__proto__'] = proto;
			return obj;
		};
	})();
	/**
	 * fixed CustomEvent
	 */
	(function () {
		if (typeof window.CustomEvent === 'undefined') {
			var _CustomEvent = function _CustomEvent(event, params) {
				params = params || {
					bubbles: false,
					cancelable: false,
					detail: undefined
				};
				var evt = document.createEvent('Events');
				var bubbles = true;
				for (var name in params) {
					name === 'bubbles' ? bubbles = !!params[name] : evt[name] = params[name];
				}
				evt.initEvent(event, bubbles, true);
				return evt;
			};

			;
			_CustomEvent.prototype = window.Event.prototype;
			window.CustomEvent = _CustomEvent;
		}
	})();
	/*
		A shim for non ES5 supporting browsers.
		Adds function bind to Function prototype, so that you can do partial application.
		Works even with the nasty thing, where the first word is the opposite of extranet, the second one is the profession of Columbus, and the version number is 9, flipped 180 degrees.
	*/

	Function.prototype.bind = Function.prototype.bind || function (to) {
		// Make an array of our arguments, starting from second argument
		var partial = Array.prototype.splice.call(arguments, 1),

		// We'll need the original function.
		fn = this;
		var bound = function bound() {
			// Join the already applied arguments to the now called ones (after converting to an array again).
			var args = partial.concat(Array.prototype.splice.call(arguments, 0));
			// If not being called as a constructor
			if (!(this instanceof bound)) {
				// return the result of the function called bound to target and partially applied.
				return fn.apply(to, args);
			}
			// If being called as a constructor, apply the function bound to self.
			fn.apply(this, args);
		};
		// Attach the prototype of the function to our newly created function.
		bound.prototype = fn.prototype;
		return bound;
	};
	/**
	 * mui fixed classList
	 * @param {type} document
	 * @returns {undefined}
	 */
	(function (document) {
		if (!("classList" in document.documentElement) && _defineProperty2.default && typeof HTMLElement !== 'undefined') {

			Object.defineProperty(HTMLElement.prototype, 'classList', {
				get: function get() {
					var self = this;
					function update(fn) {
						return function (value) {
							var classes = self.className.split(/\s+/),
							    index = classes.indexOf(value);

							fn(classes, index, value);
							self.className = classes.join(" ");
						};
					}

					var ret = {
						add: update(function (classes, index, value) {
							~index || classes.push(value);
						}),
						remove: update(function (classes, index) {
							~index && classes.splice(index, 1);
						}),
						toggle: update(function (classes, index, value) {
							~index ? classes.splice(index, 1) : classes.push(value);
						}),
						contains: function contains(value) {
							return !!~self.className.split(/\s+/).indexOf(value);
						},
						item: function item(i) {
							return self.className.split(/\s+/)[i] || null;
						}
					};

					Object.defineProperty(ret, 'length', {
						get: function get() {
							return self.className.split(/\s+/).length;
						}
					});

					return ret;
				}
			});
		}
	})(document);

	/**
	 * mui fixed requestAnimationFrame
	 * @param {type} window
	 * @returns {undefined}
	 */
	(function (window) {
		if (!window.requestAnimationFrame) {
			var lastTime = 0;
			window.requestAnimationFrame = window.webkitRequestAnimationFrame || function (callback, element) {
				var currTime = new Date().getTime();
				var timeToCall = Math.max(0, 16.7 - (currTime - lastTime));
				var id = window.setTimeout(function () {
					callback(currTime + timeToCall);
				}, timeToCall);
				lastTime = currTime + timeToCall;
				return id;
			};
			window.cancelAnimationFrame = window.webkitCancelAnimationFrame || window.webkitCancelRequestAnimationFrame || function (id) {
				clearTimeout(id);
			};
		};
	})(window);

	(function ($, window) {
		function detect(ua) {
			this.os = {};
			var funcs = [function () {
				//wechat
				var wechat = ua.match(/(MicroMessenger)\/([\d\.]+)/i);
				if (wechat) {
					//wechat
					this.os.wechat = {
						version: wechat[2].replace(/_/g, '.')
					};
				}
				return false;
			}, function () {
				//android
				var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/);
				if (android) {
					this.os.android = true;
					this.os.version = android[2];

					this.os.isBadAndroid = !/Chrome\/\d/.test(window.navigator.appVersion);
				}
				return this.os.android === true;
			}, function () {
				//ios
				var iphone = ua.match(/(iPhone\sOS)\s([\d_]+)/);
				if (iphone) {
					//iphone
					this.os.ios = this.os.iphone = true;
					this.os.version = iphone[2].replace(/_/g, '.');
				} else {
					var ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
					if (ipad) {
						//ipad
						this.os.ios = this.os.ipad = true;
						this.os.version = ipad[2].replace(/_/g, '.');
					}
				}
				return this.os.ios === true;
			}];
			[].every.call(funcs, function (func) {
				return !func.call($);
			});
		}
		detect.call($, navigator.userAgent);
	})(R, window);

	(function ($) {
		if ('ontouchstart' in window) {
			$.isTouchable = true;
			$.EVENT_START = 'touchstart';
			$.EVENT_MOVE = 'touchmove';
			$.EVENT_END = 'touchend';
		} else {
			$.isTouchable = false;
			$.EVENT_START = 'mousedown';
			$.EVENT_MOVE = 'mousemove';
			$.EVENT_END = 'mouseup';
		}
		$.EVENT_CANCEL = 'touchcancel';
		$.EVENT_CLICK = 'click';
	})(R);
	/**
	 * mui animation
	 */
	(function ($, window) {
		/**
	  * scrollTo
	  */
		$.scrollTo = function (scrollTop, duration, callback) {
			duration = duration || 1000;
			var scroll = function scroll(duration) {
				if (duration <= 0) {
					window.scrollTo(0, scrollTop);
					callback && callback();
					return;
				}
				var distaince = scrollTop - window.scrollY;
				setTimeout(function () {
					window.scrollTo(0, window.scrollY + distaince / duration * 10);
					scroll(duration - 10);
				}, 16.7);
			};
			scroll(duration);
		};
		$.animationFrame = function (cb) {
			var args, isQueued, context;
			return function () {
				args = arguments;
				context = this;
				if (!isQueued) {
					isQueued = true;
					requestAnimationFrame(function () {
						cb.apply(context, args);
						isQueued = false;
					});
				}
			};
		};
	})(R, window);

	/**
	 *  target(action>popover>modal>tab>toggle)
	 */
	(function ($, window, document) {
		/**
	  * targets
	  */
		$.targets = {};
		/**
	  * target handles
	  */
		$.targetHandles = [];
		/**
	  * register target
	  * @param {type} target
	  * @returns {$.targets}
	  */
		$.registerTarget = function (target) {

			target.index = target.index || 1000;

			$.targetHandles.push(target);

			$.targetHandles.sort(function (a, b) {
				return a.index - b.index;
			});

			return $.targetHandles;
		};
		window.addEventListener($.EVENT_START, function (event) {
			var target = event.target;
			var founds = {};
			for (; target && target !== document; target = target.parentNode) {
				var isFound = false;
				$.each($.targetHandles, function (index, targetHandle) {
					var name = targetHandle.name;
					if (!isFound && !founds[name] && targetHandle.hasOwnProperty('handle')) {
						$.targets[name] = targetHandle.handle(event, target);
						if ($.targets[name]) {
							founds[name] = true;
							if (targetHandle.isContinue !== true) {
								isFound = true;
							}
						}
					} else {
						if (!founds[name]) {
							if (targetHandle.isReset !== false) $.targets[name] = false;
						}
					}
				});
				if (isFound) {
					break;
				}
			}
		});
		window.addEventListener('click', function (event) {
			//解决touch与click的target不一致的问题(比如链接边缘点击时，touch的target为html，而click的target为A)
			var target = event.target;
			var isFound = false;
			for (; target && target !== document; target = target.parentNode) {
				if (target.tagName === 'A') {
					$.each($.targetHandles, function (index, targetHandle) {
						var name = targetHandle.name;
						if (targetHandle.hasOwnProperty('handle')) {
							if (targetHandle.handle(event, target)) {
								isFound = true;
								event.preventDefault();
								return false;
							}
						}
					});
					if (isFound) {
						break;
					}
				}
			}
		});
	})(R, window, document);

	/**
	 * fastclick(only for radio,checkbox)
	 */
	(function ($, window, name) {
		if (!$.os.android && !$.os.ios) {
			//目前仅识别android和ios
			return;
		}
		if (window.FastClick) {
			return;
		}

		var handle = function handle(event, target) {
			if (target.tagName === 'LABEL') {
				if (target.parentNode) {
					target = target.parentNode.querySelector('input');
				}
			}
			if (target && (target.type === 'radio' || target.type === 'checkbox')) {
				if (!target.disabled) {
					//disabled
					return target;
				}
			}
			return false;
		};

		$.registerTarget({
			name: name,
			index: 40,
			handle: handle,
			target: false
		});
		var dispatchEvent = function dispatchEvent(event) {
			var targetElement = $.targets.click;
			if (targetElement) {
				var clickEvent, touch;
				// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect
				if (document.activeElement && document.activeElement !== targetElement) {
					document.activeElement.blur();
				}
				touch = event.detail.gesture.changedTouches[0];
				// Synthesise a click event, with an extra attribute so it can be tracked
				clickEvent = document.createEvent('MouseEvents');
				clickEvent.initMouseEvent('click', true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
				clickEvent.forwardedTouchEvent = true;
				targetElement.dispatchEvent(clickEvent);
				event.detail && event.detail.gesture.preventDefault();
			}
		};
		window.addEventListener('tap', dispatchEvent);
		window.addEventListener('doubletap', dispatchEvent);
		//捕获
		window.addEventListener('click', function (event) {
			if ($.targets.click) {
				if (!event.forwardedTouchEvent) {
					//stop click
					if (event.stopImmediatePropagation) {
						event.stopImmediatePropagation();
					} else {
						// Part of the hack for browsers that don't support Event#stopImmediatePropagation
						event.propagationStopped = true;
					}
					event.stopPropagation();
					event.preventDefault();
					return false;
				}
			}
		}, true);
	})(R, window, 'click');
	(function ($, document) {
		$(function () {
			if (!$.os.ios) {
				return;
			}
			var CLASS_FOCUSIN = 'R-focusin';
			var CLASS_BAR_TAB = 'R-bar-tab';
			var CLASS_BAR_FOOTER = 'R-bar-footer';
			var CLASS_BAR_FOOTER_SECONDARY = 'R-bar-footer-secondary';
			var CLASS_BAR_FOOTER_SECONDARY_TAB = 'R-bar-footer-secondary-tab';
			// var content = document.querySelector('.' + CLASS_CONTENT);
			// if (content) {
			// 	document.body.insertBefore(content, document.body.firstElementChild);
			// }
			document.addEventListener('focusin', function (e) {
				if ($.os.plus) {
					//在父webview里边不fix
					if (window.plus) {
						if (plus.webview.currentWebview().children().length > 0) {
							return;
						}
					}
				}
				var target = e.target;
				//TODO 需考虑所有键盘弹起的情况
				if (target.tagName && (target.tagName === 'TEXTAREA' || target.tagName === 'INPUT' && (target.type === 'text' || target.type === 'search' || target.type === 'number'))) {
					if (target.disabled || target.readOnly) {
						return;
					}
					document.body.classList.add(CLASS_FOCUSIN);
					var isFooter = false;
					for (; target && target !== document; target = target.parentNode) {
						var classList = target.classList;
						if (classList && classList.contains(CLASS_BAR_TAB) || classList.contains(CLASS_BAR_FOOTER) || classList.contains(CLASS_BAR_FOOTER_SECONDARY) || classList.contains(CLASS_BAR_FOOTER_SECONDARY_TAB)) {
							isFooter = true;
							break;
						}
					}
					if (isFooter) {
						var scrollTop = document.body.scrollHeight;
						var scrollLeft = document.body.scrollLeft;
						setTimeout(function () {
							window.scrollTo(scrollLeft, scrollTop);
						}, 20);
					}
				}
			});
			document.addEventListener('focusout', function (e) {
				var classList = document.body.classList;
				if (classList.contains(CLASS_FOCUSIN)) {
					classList.remove(CLASS_FOCUSIN);
					setTimeout(function () {
						window.scrollTo(document.body.scrollLeft, document.body.scrollTop);
					}, 20);
				}
			});
		});
	})(R, document);

	/**
	 * R namespace(optimization)
	 * @param {type} $
	 * @returns {undefined}
	 */
	(function ($) {
		$.namespace = 'R';
		$.classNamePrefix = $.namespace + '-';
		$.classSelectorPrefix = '.' + $.classNamePrefix;
		/**
	  * 返回正确的className
	  * @param {type} className
	  * @returns {String}
	  */
		$.className = function (className) {
			return $.classNamePrefix + className;
		};
		/**
	  * 返回正确的classSelector
	  * @param {type} classSelector
	  * @returns {String}
	  */
		$.classSelector = function (classSelector) {
			return classSelector.replace(/\./g, $.classSelectorPrefix);
		};
		/**
	         * 返回正确的eventName
	         * @param {type} event
	         * @param {type} module
	         * @returns {String}
	         */
		$.eventName = function (event, module) {
			return event + ($.namespace ? '.' + $.namespace : '') + (module ? '.' + module : '');
		};
	})(R);

	/**
	 * R gestures
	 * @param {type} $
	 * @param {type} window
	 * @returns {undefined}
	 */
	(function ($, window) {
		$.gestures = {
			session: {}
		};
		/**
	  * Gesture preventDefault
	  * @param {type} e
	  * @returns {undefined}
	  */
		$.preventDefault = function (e) {
			e.preventDefault();
		};
		/**
	  * Gesture stopPropagation
	  * @param {type} e
	  * @returns {undefined}
	  */
		$.stopPropagation = function (e) {
			e.stopPropagation();
		};

		/**
	  * register gesture
	  * @param {type} gesture
	  * @returns {$.gestures}
	  */
		$.addGesture = function (gesture) {
			return $.addAction('gestures', gesture);
		};

		var round = Math.round;
		var abs = Math.abs;
		var sqrt = Math.sqrt;
		var atan = Math.atan;
		var atan2 = Math.atan2;
		/**
	  * distance
	  * @param {type} p1
	  * @param {type} p2
	  * @returns {Number}
	  */
		var getDistance = function getDistance(p1, p2, props) {
			if (!props) {
				props = ['x', 'y'];
			}
			var x = p2[props[0]] - p1[props[0]];
			var y = p2[props[1]] - p1[props[1]];
			return sqrt(x * x + y * y);
		};
		/**
	  * scale
	  * @param {Object} starts
	  * @param {Object} moves
	  */
		var getScale = function getScale(starts, moves) {
			if (starts.length >= 2 && moves.length >= 2) {
				var props = ['pageX', 'pageY'];
				return getDistance(moves[1], moves[0], props) / getDistance(starts[1], starts[0], props);
			}
			return 1;
		};
		/**
	  * angle
	  * @param {type} p1
	  * @param {type} p2
	  * @returns {Number}
	  */
		var getAngle = function getAngle(p1, p2, props) {
			if (!props) {
				props = ['x', 'y'];
			}
			var x = p2[props[0]] - p1[props[0]];
			var y = p2[props[1]] - p1[props[1]];
			return atan2(y, x) * 180 / Math.PI;
		};
		/**
	  * direction
	  * @param {Object} x
	  * @param {Object} y
	  */
		var getDirection = function getDirection(x, y) {
			if (x === y) {
				return '';
			}
			if (abs(x) >= abs(y)) {
				return x > 0 ? 'left' : 'right';
			}
			return y > 0 ? 'up' : 'down';
		};
		/**
	  * rotation
	  * @param {Object} start
	  * @param {Object} end
	  */
		var getRotation = function getRotation(start, end) {
			var props = ['pageX', 'pageY'];
			return getAngle(end[1], end[0], props) - getAngle(start[1], start[0], props);
		};
		/**
	  * px per ms
	  * @param {Object} deltaTime
	  * @param {Object} x
	  * @param {Object} y
	  */
		var getVelocity = function getVelocity(deltaTime, x, y) {
			return {
				x: x / deltaTime || 0,
				y: y / deltaTime || 0
			};
		};
		/**
	  * detect gestures
	  * @param {type} event
	  * @param {type} touch
	  * @returns {undefined}
	  */
		var detect = function detect(event, touch) {
			if ($.gestures.stoped) {
				return;
			}
			$.doAction('gestures', function (index, gesture) {
				if (!$.gestures.stoped) {
					if ($.options.gestureConfig[gesture.name] !== false) {
						gesture.handle(event, touch);
					}
				}
			});
		};
		/**
	  * 暂时无用
	  * @param {Object} node
	  * @param {Object} parent
	  */
		var hasParent = function hasParent(node, parent) {
			while (node) {
				if (node == parent) {
					return true;
				}
				node = node.parentNode;
			}
			return false;
		};

		var uniqueArray = function uniqueArray(src, key, sort) {
			var results = [];
			var values = [];
			var i = 0;

			while (i < src.length) {
				var val = key ? src[i][key] : src[i];
				if (values.indexOf(val) < 0) {
					results.push(src[i]);
				}
				values[i] = val;
				i++;
			}

			if (sort) {
				if (!key) {
					results = results.sort();
				} else {
					results = results.sort(function sortUniqueArray(a, b) {
						return a[key] > b[key];
					});
				}
			}

			return results;
		};
		var getMultiCenter = function getMultiCenter(touches) {
			var touchesLength = touches.length;
			if (touchesLength === 1) {
				return {
					x: round(touches[0].pageX),
					y: round(touches[0].pageY)
				};
			}

			var x = 0;
			var y = 0;
			var i = 0;
			while (i < touchesLength) {
				x += touches[i].pageX;
				y += touches[i].pageY;
				i++;
			}

			return {
				x: round(x / touchesLength),
				y: round(y / touchesLength)
			};
		};
		var multiTouch = function multiTouch() {
			return $.options.gestureConfig.pinch;
		};
		var copySimpleTouchData = function copySimpleTouchData(touch) {
			var touches = [];
			var i = 0;
			while (i < touch.touches.length) {
				touches[i] = {
					pageX: round(touch.touches[i].pageX),
					pageY: round(touch.touches[i].pageY)
				};
				i++;
			}
			return {
				timestamp: $.now(),
				gesture: touch.gesture,
				touches: touches,
				center: getMultiCenter(touch.touches),
				deltaX: touch.deltaX,
				deltaY: touch.deltaY
			};
		};

		var calDelta = function calDelta(touch) {
			var session = $.gestures.session;
			var center = touch.center;
			var offset = session.offsetDelta || {};
			var prevDelta = session.prevDelta || {};
			var prevTouch = session.prevTouch || {};

			if (touch.gesture.type === $.EVENT_START || touch.gesture.type === $.EVENT_END) {
				prevDelta = session.prevDelta = {
					x: prevTouch.deltaX || 0,
					y: prevTouch.deltaY || 0
				};

				offset = session.offsetDelta = {
					x: center.x,
					y: center.y
				};
			}
			touch.deltaX = prevDelta.x + (center.x - offset.x);
			touch.deltaY = prevDelta.y + (center.y - offset.y);
		};
		var calTouchData = function calTouchData(touch) {
			var session = $.gestures.session;
			var touches = touch.touches;
			var touchesLength = touches.length;

			if (!session.firstTouch) {
				session.firstTouch = copySimpleTouchData(touch);
			}

			if (multiTouch() && touchesLength > 1 && !session.firstMultiTouch) {
				session.firstMultiTouch = copySimpleTouchData(touch);
			} else if (touchesLength === 1) {
				session.firstMultiTouch = false;
			}

			var firstTouch = session.firstTouch;
			var firstMultiTouch = session.firstMultiTouch;
			var offsetCenter = firstMultiTouch ? firstMultiTouch.center : firstTouch.center;

			var center = touch.center = getMultiCenter(touches);
			touch.timestamp = $.now();
			touch.deltaTime = touch.timestamp - firstTouch.timestamp;

			touch.angle = getAngle(offsetCenter, center);
			touch.distance = getDistance(offsetCenter, center);

			calDelta(touch);

			touch.offsetDirection = getDirection(touch.deltaX, touch.deltaY);

			touch.scale = firstMultiTouch ? getScale(firstMultiTouch.touches, touches) : 1;
			touch.rotation = firstMultiTouch ? getRotation(firstMultiTouch.touches, touches) : 0;

			calIntervalTouchData(touch);
		};
		var CAL_INTERVAL = 25;
		var calIntervalTouchData = function calIntervalTouchData(touch) {
			var session = $.gestures.session;
			var last = session.lastInterval || touch;
			var deltaTime = touch.timestamp - last.timestamp;
			var velocity;
			var velocityX;
			var velocityY;
			var direction;

			if (touch.gesture.type != $.EVENT_CANCEL && (deltaTime > CAL_INTERVAL || last.velocity === undefined)) {
				var deltaX = last.deltaX - touch.deltaX;
				var deltaY = last.deltaY - touch.deltaY;

				var v = getVelocity(deltaTime, deltaX, deltaY);
				velocityX = v.x;
				velocityY = v.y;
				velocity = abs(v.x) > abs(v.y) ? v.x : v.y;
				direction = getDirection(deltaX, deltaY) || last.direction;

				session.lastInterval = touch;
			} else {
				velocity = last.velocity;
				velocityX = last.velocityX;
				velocityY = last.velocityY;
				direction = last.direction;
			}

			touch.velocity = velocity;
			touch.velocityX = velocityX;
			touch.velocityY = velocityY;
			touch.direction = direction;
		};
		var targetIds = {};
		var convertTouches = function convertTouches(touches) {
			for (var i = 0; i < touches.length; i++) {
				!touches['identifier'] && (touches['identifier'] = 0);
			}
			return touches;
		};
		var getTouches = function getTouches(event, touch) {
			var allTouches = convertTouches($.slice.call(event.touches || [event]));

			var type = event.type;

			var targetTouches = [];
			var changedTargetTouches = [];

			//当touchstart或touchmove且touches长度为1，直接获得all和changed
			if ((type === $.EVENT_START || type === $.EVENT_MOVE) && allTouches.length === 1) {
				targetIds[allTouches[0].identifier] = true;
				targetTouches = allTouches;
				changedTargetTouches = allTouches;
				touch.target = event.target;
			} else {
				var i = 0;
				var targetTouches = [];
				var changedTargetTouches = [];
				var changedTouches = convertTouches($.slice.call(event.changedTouches || [event]));

				touch.target = event.target;
				var sessionTarget = $.gestures.session.target || event.target;
				targetTouches = allTouches.filter(function (touch) {
					return hasParent(touch.target, sessionTarget);
				});

				if (type === $.EVENT_START) {
					i = 0;
					while (i < targetTouches.length) {
						targetIds[targetTouches[i].identifier] = true;
						i++;
					}
				}

				i = 0;
				while (i < changedTouches.length) {
					if (targetIds[changedTouches[i].identifier]) {
						changedTargetTouches.push(changedTouches[i]);
					}
					if (type === $.EVENT_END || type === $.EVENT_CANCEL) {
						delete targetIds[changedTouches[i].identifier];
					}
					i++;
				}

				if (!changedTargetTouches.length) {
					return false;
				}
			}
			targetTouches = uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true);
			var touchesLength = targetTouches.length;
			var changedTouchesLength = changedTargetTouches.length;
			if (type === $.EVENT_START && touchesLength - changedTouchesLength === 0) {
				//first
				touch.isFirst = true;
				$.gestures.touch = $.gestures.session = {
					target: event.target
				};
			}
			touch.isFinal = (type === $.EVENT_END || type === $.EVENT_CANCEL) && touchesLength - changedTouchesLength === 0;

			touch.touches = targetTouches;
			touch.changedTouches = changedTargetTouches;
			return true;
		};
		var handleTouchEvent = function handleTouchEvent(event) {
			var touch = {
				gesture: event
			};
			var touches = getTouches(event, touch);
			if (!touches) {
				return;
			}
			calTouchData(touch);
			detect(event, touch);
			$.gestures.session.prevTouch = touch;
			if (event.type === $.EVENT_END && !$.isTouchable) {
				$.gestures.touch = $.gestures.session = {};
			}
		};
		window.addEventListener($.EVENT_START, handleTouchEvent);
		window.addEventListener($.EVENT_MOVE, handleTouchEvent);
		window.addEventListener($.EVENT_END, handleTouchEvent);
		window.addEventListener($.EVENT_CANCEL, handleTouchEvent);
		//fixed hashchange(android)
		window.addEventListener($.EVENT_CLICK, function (e) {
			//TODO 应该判断当前target是不是在targets.popover内部，而不是非要相等
			if (($.os.android || $.os.ios) && ($.targets.popover && e.target === $.targets.popover || $.targets.tab || $.targets.offcanvas || $.targets.modal)) {
				e.preventDefault();
			}
		}, true);

		//增加原生滚动识别
		$.isScrolling = false;
		var scrollingTimeout = null;
		window.addEventListener('scroll', function () {
			$.isScrolling = true;
			scrollingTimeout && clearTimeout(scrollingTimeout);
			scrollingTimeout = setTimeout(function () {
				$.isScrolling = false;
			}, 250);
		});
	})(R, window);
	/**
	 * R gesture flick[left|right|up|down]
	 * @param {type} $
	 * @param {type} name
	 * @returns {undefined}
	 */
	(function ($, name) {
		var flickStartTime = 0;
		var handle = function handle(event, touch) {
			var session = $.gestures.session;
			var options = this.options;
			var now = $.now();
			switch (event.type) {
				case $.EVENT_MOVE:
					if (now - flickStartTime > 300) {
						flickStartTime = now;
						session.flickStart = touch.center;
					}
					break;
				case $.EVENT_END:
				case $.EVENT_CANCEL:
					touch.flick = false;
					if (session.flickStart && options.flickMaxTime > now - flickStartTime && touch.distance > options.flickMinDistince) {
						touch.flick = true;
						touch.flickTime = now - flickStartTime;
						touch.flickDistanceX = touch.center.x - session.flickStart.x;
						touch.flickDistanceY = touch.center.y - session.flickStart.y;
						$.trigger(session.target, name, touch);
						$.trigger(session.target, name + touch.direction, touch);
					}
					break;
			}
		};
		/**
	  * R gesture flick
	  */
		$.addGesture({
			name: name,
			index: 5,
			handle: handle,
			options: {
				flickMaxTime: 200,
				flickMinDistince: 10
			}
		});
	})(R, 'flick');
	/**
	 * R gesture swipe[left|right|up|down]
	 * @param {type} $
	 * @param {type} name
	 * @returns {undefined}
	 */
	(function ($, name) {
		var handle = function handle(event, touch) {
			var session = $.gestures.session;
			if (event.type === $.EVENT_END || event.type === $.EVENT_CANCEL) {
				var options = this.options;
				touch.swipe = false;
				//TODO 后续根据velocity计算
				if (touch.direction && options.swipeMaxTime > touch.deltaTime && touch.distance > options.swipeMinDistince) {
					touch.swipe = true;
					$.trigger(session.target, name, touch);
					$.trigger(session.target, name + touch.direction, touch);
				}
			}
		};
		/**
	  * R gesture swipe
	  */
		$.addGesture({
			name: name,
			index: 10,
			handle: handle,
			options: {
				swipeMaxTime: 300,
				swipeMinDistince: 18
			}
		});
	})(R, 'swipe');
	/**
	 * R gesture drag[start|left|right|up|down|end]
	 * @param {type} $
	 * @param {type} name
	 * @returns {undefined}
	 */
	(function ($, name) {
		var handle = function handle(event, touch) {
			var session = $.gestures.session;
			switch (event.type) {
				case $.EVENT_START:
					break;
				case $.EVENT_MOVE:
					if (!touch.direction || !session.target) {
						return;
					}
					//修正direction,可在session期间自行锁定拖拽方向，方便开发scroll类不同方向拖拽插件嵌套
					if (session.lockDirection && session.startDirection) {
						if (session.startDirection && session.startDirection !== touch.direction) {
							if (session.startDirection === 'up' || session.startDirection === 'down') {
								touch.direction = touch.deltaY < 0 ? 'up' : 'down';
							} else {
								touch.direction = touch.deltaX < 0 ? 'left' : 'right';
							}
						}
					}

					if (!session.drag) {
						session.drag = true;
						$.trigger(session.target, name + 'start', touch);
					}
					$.trigger(session.target, name, touch);
					$.trigger(session.target, name + touch.direction, touch);
					break;
				case $.EVENT_END:
				case $.EVENT_CANCEL:
					if (session.drag && touch.isFinal) {
						$.trigger(session.target, name + 'end', touch);
					}
					break;
			}
		};
		/**
	  * R gesture drag
	  */
		$.addGesture({
			name: name,
			index: 20,
			handle: handle,
			options: {
				fingers: 1
			}
		});
	})(R, 'drag');
	/**
	 * R gesture tap and doubleTap
	 * @param {type} $
	 * @param {type} name
	 * @returns {undefined}
	 */
	(function ($, name) {
		var lastTarget;
		var lastTapTime;
		var handle = function handle(event, touch) {
			var session = $.gestures.session;
			var options = this.options;
			switch (event.type) {
				case $.EVENT_END:
					if (!touch.isFinal) {
						return;
					}
					var target = session.target;
					if (!target || target.disabled || target.classList && target.classList.contains('R-disabled')) {
						return;
					}
					if (touch.distance < options.tapMaxDistance && touch.deltaTime < options.tapMaxTime) {
						if ($.options.gestureConfig.doubletap && lastTarget && lastTarget === target) {
							//same target
							if (lastTapTime && touch.timestamp - lastTapTime < options.tapMaxInterval) {
								$.trigger(target, 'doubletap', touch);
								lastTapTime = $.now();
								lastTarget = target;
								return;
							}
						}
						$.trigger(target, name, touch);
						lastTapTime = $.now();
						lastTarget = target;
					}
					break;
			}
		};
		/**
	  * R gesture tap
	  */
		$.addGesture({
			name: name,
			index: 30,
			handle: handle,
			options: {
				fingers: 1,
				tapMaxInterval: 300,
				tapMaxDistance: 5,
				tapMaxTime: 250
			}
		});
	})(R, 'tap');
	/**
	 * R gesture longtap
	 * @param {type} $
	 * @param {type} name
	 * @returns {undefined}
	 */
	(function ($, name) {
		var timer;
		var handle = function handle(event, touch) {
			var session = $.gestures.session;
			var options = this.options;
			switch (event.type) {
				case $.EVENT_START:
					clearTimeout(timer);
					timer = setTimeout(function () {
						$.trigger(session.target, name, touch);
					}, options.holdTimeout);
					break;
				case $.EVENT_MOVE:
					if (touch.distance > options.holdThreshold) {
						clearTimeout(timer);
					}
					break;
				case $.EVENT_END:
				case $.EVENT_CANCEL:
					clearTimeout(timer);
					break;
			}
		};
		/**
	  * R gesture longtap
	  */
		$.addGesture({
			name: name,
			index: 10,
			handle: handle,
			options: {
				fingers: 1,
				holdTimeout: 500,
				holdThreshold: 2
			}
		});
	})(R, 'longtap');
	/**
	 * R gesture hold
	 * @param {type} $
	 * @param {type} name
	 * @returns {undefined}
	 */
	(function ($, name) {
		var timer;
		var handle = function handle(event, touch) {
			var session = $.gestures.session;
			var options = this.options;
			switch (event.type) {
				case $.EVENT_START:
					if ($.options.gestureConfig.hold) {
						timer && clearTimeout(timer);
						timer = setTimeout(function () {
							touch.hold = true;
							$.trigger(session.target, name, touch);
						}, options.holdTimeout);
					}
					break;
				case $.EVENT_MOVE:
					break;
				case $.EVENT_END:
				case $.EVENT_CANCEL:
					if (timer) {
						clearTimeout(timer) && (timer = null);
						$.trigger(session.target, 'release', touch);
					}
					break;
			}
		};
		/**
	  * R gesture hold
	  */
		$.addGesture({
			name: name,
			index: 10,
			handle: handle,
			options: {
				fingers: 1,
				holdTimeout: 0
			}
		});
	})(R, 'hold');
	/**
	 * R gesture pinch
	 * @param {type} $
	 * @param {type} name
	 * @returns {undefined}
	 */
	(function ($, name) {
		var handle = function handle(event, touch) {
			var options = this.options;
			var session = $.gestures.session;
			switch (event.type) {
				case $.EVENT_START:
					break;
				case $.EVENT_MOVE:
					if ($.options.gestureConfig.pinch) {
						if (touch.touches.length < 2) {
							return;
						}
						if (!session.pinch) {
							//start
							session.pinch = true;
							$.trigger(session.target, name + 'start', touch);
						}
						$.trigger(session.target, name, touch);
						var scale = touch.scale;
						var rotation = touch.rotation;
						var lastScale = typeof touch.lastScale === 'undefined' ? 1 : touch.lastScale;
						var scaleDiff = 0.000000000001; //防止scale与lastScale相等，不触发事件的情况。
						if (scale > lastScale) {
							//out
							lastScale = scale - scaleDiff;
							$.trigger(session.target, name + 'out', touch);
						} //in
						else if (scale < lastScale) {
								lastScale = scale + scaleDiff;
								$.trigger(session.target, name + 'in', touch);
							}
						if (Math.abs(rotation) > options.minRotationAngle) {
							$.trigger(session.target, 'rotate', touch);
						}
					}
					break;
				case $.EVENT_END:
				case $.EVENT_CANCEL:
					if ($.options.gestureConfig.pinch && session.pinch && touch.touches.length === 2) {
						session.pinch = false;
						$.trigger(session.target, name + 'end', touch);
					}
					break;
			}
		};
		/**
	  * R gesture pinch
	  */
		$.addGesture({
			name: name,
			index: 10,
			handle: handle,
			options: {
				minRotationAngle: 0
			}
		});
	})(R, 'pinch');

	/**
	 * R.init
	 * @param {type} $
	 * @returns {undefined}
	 */
	(function ($) {
		$.global = $.options = {
			gestureConfig: {
				tap: true,
				doubletap: false,
				longtap: false,
				hold: false,
				flick: true,
				swipe: true,
				drag: true,
				pinch: false
			}
		};
		/**
	  *
	  * @param {type} options
	  * @returns {undefined}
	  */
		$.initGlobal = function (options) {
			$.options = $.extend(true, $.global, options);
			return this;
		};
		var inits = {};

		var isInitialized = false;
		//TODO 自动调用init?因为用户自己调用init的时机可能不确定，如果晚于自动init，则会有潜在问题
		//	$.ready(function() {
		//		setTimeout(function() {
		//			if (!isInitialized) {
		//				$.init();
		//			}
		//		}, 300);
		//	});
		/**
	  * 单页配置 初始化
	  * @param {object} options
	  */
		$.init = function (options) {
			isInitialized = true;
			$.options = $.extend(true, $.global, options || {});
			$.ready(function () {
				$.doAction('inits', function (index, init) {
					var isInit = !!(!inits[init.name] || init.repeat);
					if (isInit) {
						init.handle.call($);
						inits[init.name] = true;
					}
				});
			});
			return this;
		};

		/**
	  * 增加初始化执行流程
	  * @param {function} init
	  */
		$.addInit = function (init) {
			return $.addAction('inits', init);
		};
		/**
	  * 处理html5版本subpages
	  */
		$.addInit({
			name: 'iframe',
			index: 100,
			handle: function handle() {
				var options = $.options;
				var subpages = options.subpages || [];
				if (!$.os.plus && subpages.length) {
					//暂时只处理单个subpage。后续可以考虑支持多个subpage
					createIframe(subpages[0]);
				}
			}
		});
		var createIframe = function createIframe(options) {
			var wrapper = document.createElement('div');
			wrapper.className = 'R-iframe-wrapper';
			var styles = options.styles || {};
			if (typeof styles.top !== 'string') {
				styles.top = '0px';
			}
			if (typeof styles.bottom !== 'string') {
				styles.bottom = '0px';
			}
			wrapper.style.top = styles.top;
			wrapper.style.bottom = styles.bottom;
			var iframe = document.createElement('iframe');
			iframe.src = options.url;
			iframe.id = options.id || options.url;
			iframe.name = iframe.id;
			wrapper.appendChild(iframe);
			document.body.appendChild(wrapper);
			//目前仅处理微信
			$.os.wechat && handleScroll(wrapper, iframe);
		};

		function handleScroll(wrapper, iframe) {
			var key = 'R_SCROLL_POSITION_' + document.location.href + '_' + iframe.src;
			var scrollTop = parseFloat(localStorage.getItem(key)) || 0;
			if (scrollTop) {
				(function (y) {
					iframe.onload = function () {
						window.scrollTo(0, y);
					};
				})(scrollTop);
			}
			setInterval(function () {
				var _scrollTop = window.scrollY;
				if (scrollTop !== _scrollTop) {
					localStorage.setItem(key, _scrollTop + '');
					scrollTop = _scrollTop;
				}
			}, 100);
		};
		$(function () {
			var classList = document.body.classList;
			var os = [];
			if ($.os.ios) {
				os.push({
					os: 'ios',
					version: $.os.version
				});
				classList.add('R-ios');
			} else if ($.os.android) {
				os.push({
					os: 'android',
					version: $.os.version
				});
				classList.add('R-android');
			}
			if ($.os.wechat) {
				os.push({
					os: 'wechat',
					version: $.os.wechat.version
				});
				classList.add('R-wechat');
			}
			if (os.length) {
				$.each(os, function (index, osObj) {
					var version = '';
					var classArray = [];
					if (osObj.version) {
						$.each(osObj.version.split('.'), function (i, v) {
							version = version + (version ? '-' : '') + v;
							classList.add($.className(osObj.os + '-' + version));
						});
					}
				});
			}
		});
	})(R);

	(function ($) {
		var initializing = false,
		    fnTest = /xyz/.test(function () {
			xyz;
		}) ? /\b_super\b/ : /.*/;

		var Class = function Class() {};
		Class.extend = function (prop) {
			var _super = this.prototype;
			initializing = true;
			var prototype = new this();
			initializing = false;
			for (var name in prop) {
				prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? function (name, fn) {
					return function () {
						var tmp = this._super;

						this._super = _super[name];

						var ret = fn.apply(this, arguments);
						this._super = tmp;

						return ret;
					};
				}(name, prop[name]) : prop[name];
			}
			function Class() {
				if (!initializing && this.init) this.init.apply(this, arguments);
			}
			Class.prototype = prototype;
			Class.prototype.constructor = Class;
			Class.extend = [].slice.call(arguments).callee;
			return Class;
		};
		$.Class = Class;
	})(R);

	/**
	 * helper
	 * @param {Object} $
	 * @param {Object} window
	 * @param {Object} document
	 */

	(function ($, window, document) {

		// Helper function to correctly set up the prototype chain for subclasses.
		// Similar to `goog.inherits`, but uses a hash of prototype properties and
		// class properties to be extended.
		$.sextend = function (protoProps, staticProps) {
			var parent = this;
			var child;

			// The constructor function for the new subclass is either defined by you
			// (the "constructor" property in your `extend` definition), or defaulted
			// by us to simply call the parent constructor.
			if (protoProps && _underscore2.default.has(protoProps, 'constructor')) {
				child = protoProps.constructor;
			} else {
				child = function child() {
					return parent.apply(this, arguments);
				};
			}

			// Add static properties to the constructor function, if supplied.
			_underscore2.default.extend(child, parent, staticProps);

			// Set the prototype chain to inherit from `parent`, without calling
			// `parent` constructor function.
			var Surrogate = function Surrogate() {
				this.constructor = child;
			};
			Surrogate.prototype = parent.prototype;
			child.prototype = new Surrogate();

			// Add prototype properties (instance properties) to the subclass,
			// if supplied.
			if (protoProps) _underscore2.default.extend(child.prototype, protoProps);

			// Set a convenience property in case the parent's prototype is needed
			// later.
			child.__super__ = parent.prototype;

			return child;
		};
	})(rweb, window, document);

	/**
	 * view
	 *
	 * @param {Object} $
	 * @param {Object} window
	 * @param {Object} document
	 */

	(function (R, _, $, window, document) {

		R.$ = $;

		// List of view options to be set as properties.
		var viewOptions = ['el', 'id', 'attributes', 'className', 'tagName', 'events'];

		var View = R.View = function (options) {
			this.cid = _.uniqueId('view');
			_.extend(this, _.pick(options, viewOptions));
			this._ensureElement();
			//must do synchronous action for the order
			this.initialize.apply(this, arguments);
		};

		_.extend(View.prototype, {
			// The default `tagName` of a View's element is `"div"`.
			tagName: 'div',

			// Initialize is an empty function by default. Override it with your own
			// initialization logic.
			initialize: function initialize() {},

			// **render** is the core function that your view should override, in order
			// to populate its element (`this.el`), with the appropriate HTML. The
			// convention is for **render** to always return `this`.
			render: function render() {
				return this;
			},

			//just remove out of DOM
			removeElement: function removeElement() {
				this.el.parentNode.removeChild(this.el);
			},

			// Change the view's element (`this.el` property) and re-delegate the
			// view's events on the new element.
			setElement: function setElement(element) {
				// this.undelegateEvents();
				this._setElement(element);
				// this.delegateEvents();
				return this;
			},
			_createElement: function _createElement(tagName) {
				return document.createElement(tagName);
			},

			_setElement: function _setElement(el) {
				this.$el = el[0] ? el : R.$(el);
				this.el = this.$el[0];
			},

			_setAttributes: function _setAttributes(attributes) {
				this.$el.attr(attributes);
			},
			// Ensure that the View has a DOM element to render into.
			// If `this.el` is a string, pass it through `$()`, take the first
			// matching element, and re-assign it to `el`. Otherwise, create
			// an element from the `id`, `className` and `tagName` properties.
			_ensureElement: function _ensureElement() {
				if (!this.el) {
					var attrs = _.extend({}, _.result(this, 'attributes'));
					if (this.id) attrs.id = _.result(this, 'id');
					if (this.className) attrs['class'] = _.result(this, 'className');
					this.setElement(this._createElement(_.result(this, 'tagName')));
					this._setAttributes(attrs);
				} else {
					this.setElement(_.result(this, 'el'));
				}
			}

		});

		// Set up inheritance for the view .
		View.extend = R.sextend;
	})(rweb, _underscore2.default, $, window, document);

	// View Animation Extentions

	(function (R) {
		var animations = ['slideInLeft', 'slideInRight', 'slideOutLeft', 'slideOutRight', 'slideInUp', 'slideInDown', 'slideOutUp', 'slideOutDown'];

		var EVENTS = 'removeAnimate webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';
		//animate
		var animationExtentions = {
			animate: function animate(name, options, cb) {
				options = options || { reverse: true };

				// 只传两个参数，如果第二个参数是函数，则认为是callback
				if ($.isFunction(options)) {
					cb = options;
					options = null;
				}
				// defaults
				options = _underscore2.default.defaults(options || {}, {
					reverse: true,
					duration: 1000, // ms
					infinite: false
				});

				// timeout promise
				var timeoutPromise = new _promise2.default(function (resolve, reject) {
					var timeout = setTimeout(resolve, options.duration + 100);
					this.timeout = timeout;
				}.bind(this));

				//animated promise
				var animationend = new _promise2.default(function (resolve, reject) {
					this.$el.addClass('animated ' + name);
					this.$el.one(EVENTS, function () {
						clearTimeout(this.timeout);
						if (options.reverse) this.$el.removeClass('animated ' + name);
						resolve();
					}.bind(this));
				}.bind(this));

				// 动画完成或计时器超时，任一条件达成，此机制用于处理android的动画完成函数回调不及时的问题
				return _promise2.default.race([animationend, timeoutPromise]).then(function () {
					cb && cb();
				});
			}
		};

		//transform animation name array to <name: fn> mapping json object
		var animationExtentions = animations.reduce(function (_this, animation) {
			var fn_name = 'animate' + animation.charAt(0).toUpperCase() + animation.substring(1);
			_this[fn_name] = function (options) {
				return this.animate(animation, options);
			};
			return _this;
		}, animationExtentions);

		_underscore2.default.extend(R.View.prototype, animationExtentions);
	})(rweb, window, document);

/***/ },
/* 88 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(89), __esModule: true };

/***/ },
/* 89 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(72);
	__webpack_require__(25);
	__webpack_require__(54);
	__webpack_require__(90);
	module.exports = __webpack_require__(3).Promise;

/***/ },
/* 90 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	var LIBRARY            = __webpack_require__(30)
	  , global             = __webpack_require__(9)
	  , ctx                = __webpack_require__(10)
	  , classof            = __webpack_require__(91)
	  , $export            = __webpack_require__(8)
	  , isObject           = __webpack_require__(15)
	  , aFunction          = __webpack_require__(11)
	  , anInstance         = __webpack_require__(92)
	  , forOf              = __webpack_require__(93)
	  , speciesConstructor = __webpack_require__(97)
	  , task               = __webpack_require__(98).set
	  , microtask          = __webpack_require__(100)()
	  , PROMISE            = 'Promise'
	  , TypeError          = global.TypeError
	  , process            = global.process
	  , $Promise           = global[PROMISE]
	  , process            = global.process
	  , isNode             = classof(process) == 'process'
	  , empty              = function(){ /* empty */ }
	  , Internal, GenericPromiseCapability, Wrapper;

	var USE_NATIVE = !!function(){
	  try {
	    // correct subclassing with @@species support
	    var promise     = $Promise.resolve(1)
	      , FakePromise = (promise.constructor = {})[__webpack_require__(51)('species')] = function(exec){ exec(empty, empty); };
	    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
	    return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
	  } catch(e){ /* empty */ }
	}();

	// helpers
	var sameConstructor = function(a, b){
	  // with library wrapper special case
	  return a === b || a === $Promise && b === Wrapper;
	};
	var isThenable = function(it){
	  var then;
	  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
	};
	var newPromiseCapability = function(C){
	  return sameConstructor($Promise, C)
	    ? new PromiseCapability(C)
	    : new GenericPromiseCapability(C);
	};
	var PromiseCapability = GenericPromiseCapability = function(C){
	  var resolve, reject;
	  this.promise = new C(function($$resolve, $$reject){
	    if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor');
	    resolve = $$resolve;
	    reject  = $$reject;
	  });
	  this.resolve = aFunction(resolve);
	  this.reject  = aFunction(reject);
	};
	var perform = function(exec){
	  try {
	    exec();
	  } catch(e){
	    return {error: e};
	  }
	};
	var notify = function(promise, isReject){
	  if(promise._n)return;
	  promise._n = true;
	  var chain = promise._c;
	  microtask(function(){
	    var value = promise._v
	      , ok    = promise._s == 1
	      , i     = 0;
	    var run = function(reaction){
	      var handler = ok ? reaction.ok : reaction.fail
	        , resolve = reaction.resolve
	        , reject  = reaction.reject
	        , domain  = reaction.domain
	        , result, then;
	      try {
	        if(handler){
	          if(!ok){
	            if(promise._h == 2)onHandleUnhandled(promise);
	            promise._h = 1;
	          }
	          if(handler === true)result = value;
	          else {
	            if(domain)domain.enter();
	            result = handler(value);
	            if(domain)domain.exit();
	          }
	          if(result === reaction.promise){
	            reject(TypeError('Promise-chain cycle'));
	          } else if(then = isThenable(result)){
	            then.call(result, resolve, reject);
	          } else resolve(result);
	        } else reject(value);
	      } catch(e){
	        reject(e);
	      }
	    };
	    while(chain.length > i)run(chain[i++]); // variable length - can't use forEach
	    promise._c = [];
	    promise._n = false;
	    if(isReject && !promise._h)onUnhandled(promise);
	  });
	};
	var onUnhandled = function(promise){
	  task.call(global, function(){
	    var value = promise._v
	      , abrupt, handler, console;
	    if(isUnhandled(promise)){
	      abrupt = perform(function(){
	        if(isNode){
	          process.emit('unhandledRejection', value, promise);
	        } else if(handler = global.onunhandledrejection){
	          handler({promise: promise, reason: value});
	        } else if((console = global.console) && console.error){
	          console.error('Unhandled promise rejection', value);
	        }
	      });
	      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
	      promise._h = isNode || isUnhandled(promise) ? 2 : 1;
	    } promise._a = undefined;
	    if(abrupt)throw abrupt.error;
	  });
	};
	var isUnhandled = function(promise){
	  if(promise._h == 1)return false;
	  var chain = promise._a || promise._c
	    , i     = 0
	    , reaction;
	  while(chain.length > i){
	    reaction = chain[i++];
	    if(reaction.fail || !isUnhandled(reaction.promise))return false;
	  } return true;
	};
	var onHandleUnhandled = function(promise){
	  task.call(global, function(){
	    var handler;
	    if(isNode){
	      process.emit('rejectionHandled', promise);
	    } else if(handler = global.onrejectionhandled){
	      handler({promise: promise, reason: promise._v});
	    }
	  });
	};
	var $reject = function(value){
	  var promise = this;
	  if(promise._d)return;
	  promise._d = true;
	  promise = promise._w || promise; // unwrap
	  promise._v = value;
	  promise._s = 2;
	  if(!promise._a)promise._a = promise._c.slice();
	  notify(promise, true);
	};
	var $resolve = function(value){
	  var promise = this
	    , then;
	  if(promise._d)return;
	  promise._d = true;
	  promise = promise._w || promise; // unwrap
	  try {
	    if(promise === value)throw TypeError("Promise can't be resolved itself");
	    if(then = isThenable(value)){
	      microtask(function(){
	        var wrapper = {_w: promise, _d: false}; // wrap
	        try {
	          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
	        } catch(e){
	          $reject.call(wrapper, e);
	        }
	      });
	    } else {
	      promise._v = value;
	      promise._s = 1;
	      notify(promise, false);
	    }
	  } catch(e){
	    $reject.call({_w: promise, _d: false}, e); // wrap
	  }
	};

	// constructor polyfill
	if(!USE_NATIVE){
	  // 25.4.3.1 Promise(executor)
	  $Promise = function Promise(executor){
	    anInstance(this, $Promise, PROMISE, '_h');
	    aFunction(executor);
	    Internal.call(this);
	    try {
	      executor(ctx($resolve, this, 1), ctx($reject, this, 1));
	    } catch(err){
	      $reject.call(this, err);
	    }
	  };
	  Internal = function Promise(executor){
	    this._c = [];             // <- awaiting reactions
	    this._a = undefined;      // <- checked in isUnhandled reactions
	    this._s = 0;              // <- state
	    this._d = false;          // <- done
	    this._v = undefined;      // <- value
	    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
	    this._n = false;          // <- notify
	  };
	  Internal.prototype = __webpack_require__(101)($Promise.prototype, {
	    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
	    then: function then(onFulfilled, onRejected){
	      var reaction    = newPromiseCapability(speciesConstructor(this, $Promise));
	      reaction.ok     = typeof onFulfilled == 'function' ? onFulfilled : true;
	      reaction.fail   = typeof onRejected == 'function' && onRejected;
	      reaction.domain = isNode ? process.domain : undefined;
	      this._c.push(reaction);
	      if(this._a)this._a.push(reaction);
	      if(this._s)notify(this, false);
	      return reaction.promise;
	    },
	    // 25.4.5.1 Promise.prototype.catch(onRejected)
	    'catch': function(onRejected){
	      return this.then(undefined, onRejected);
	    }
	  });
	  PromiseCapability = function(){
	    var promise  = new Internal;
	    this.promise = promise;
	    this.resolve = ctx($resolve, promise, 1);
	    this.reject  = ctx($reject, promise, 1);
	  };
	}

	$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: $Promise});
	__webpack_require__(50)($Promise, PROMISE);
	__webpack_require__(102)(PROMISE);
	Wrapper = __webpack_require__(3)[PROMISE];

	// statics
	$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
	  // 25.4.4.5 Promise.reject(r)
	  reject: function reject(r){
	    var capability = newPromiseCapability(this)
	      , $$reject   = capability.reject;
	    $$reject(r);
	    return capability.promise;
	  }
	});
	$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
	  // 25.4.4.6 Promise.resolve(x)
	  resolve: function resolve(x){
	    // instanceof instead of internal slot check because we should fix it without replacement native Promise core
	    if(x instanceof $Promise && sameConstructor(x.constructor, this))return x;
	    var capability = newPromiseCapability(this)
	      , $$resolve  = capability.resolve;
	    $$resolve(x);
	    return capability.promise;
	  }
	});
	$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(103)(function(iter){
	  $Promise.all(iter)['catch'](empty);
	})), PROMISE, {
	  // 25.4.4.1 Promise.all(iterable)
	  all: function all(iterable){
	    var C          = this
	      , capability = newPromiseCapability(C)
	      , resolve    = capability.resolve
	      , reject     = capability.reject;
	    var abrupt = perform(function(){
	      var values    = []
	        , index     = 0
	        , remaining = 1;
	      forOf(iterable, false, function(promise){
	        var $index        = index++
	          , alreadyCalled = false;
	        values.push(undefined);
	        remaining++;
	        C.resolve(promise).then(function(value){
	          if(alreadyCalled)return;
	          alreadyCalled  = true;
	          values[$index] = value;
	          --remaining || resolve(values);
	        }, reject);
	      });
	      --remaining || resolve(values);
	    });
	    if(abrupt)reject(abrupt.error);
	    return capability.promise;
	  },
	  // 25.4.4.4 Promise.race(iterable)
	  race: function race(iterable){
	    var C          = this
	      , capability = newPromiseCapability(C)
	      , reject     = capability.reject;
	    var abrupt = perform(function(){
	      forOf(iterable, false, function(promise){
	        C.resolve(promise).then(capability.resolve, reject);
	      });
	    });
	    if(abrupt)reject(abrupt.error);
	    return capability.promise;
	  }
	});

/***/ },
/* 91 */
/***/ function(module, exports, __webpack_require__) {

	// getting tag from 19.1.3.6 Object.prototype.toString()
	var cof = __webpack_require__(41)
	  , TAG = __webpack_require__(51)('toStringTag')
	  // ES3 wrong here
	  , ARG = cof(function(){ return arguments; }()) == 'Arguments';

	// fallback for IE11 Script Access Denied error
	var tryGet = function(it, key){
	  try {
	    return it[key];
	  } catch(e){ /* empty */ }
	};

	module.exports = function(it){
	  var O, T, B;
	  return it === undefined ? 'Undefined' : it === null ? 'Null'
	    // @@toStringTag case
	    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
	    // builtinTag case
	    : ARG ? cof(O)
	    // ES3 arguments fallback
	    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
	};

/***/ },
/* 92 */
/***/ function(module, exports) {

	module.exports = function(it, Constructor, name, forbiddenField){
	  if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){
	    throw TypeError(name + ': incorrect invocation!');
	  } return it;
	};

/***/ },
/* 93 */
/***/ function(module, exports, __webpack_require__) {

	var ctx         = __webpack_require__(10)
	  , call        = __webpack_require__(94)
	  , isArrayIter = __webpack_require__(95)
	  , anObject    = __webpack_require__(14)
	  , toLength    = __webpack_require__(43)
	  , getIterFn   = __webpack_require__(96)
	  , BREAK       = {}
	  , RETURN      = {};
	var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){
	  var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable)
	    , f      = ctx(fn, that, entries ? 2 : 1)
	    , index  = 0
	    , length, step, iterator, result;
	  if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!');
	  // fast case for arrays with default iterator
	  if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){
	    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
	    if(result === BREAK || result === RETURN)return result;
	  } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){
	    result = call(iterator, f, step.value, entries);
	    if(result === BREAK || result === RETURN)return result;
	  }
	};
	exports.BREAK  = BREAK;
	exports.RETURN = RETURN;

/***/ },
/* 94 */
/***/ function(module, exports, __webpack_require__) {

	// call something on iterator step with safe closing on error
	var anObject = __webpack_require__(14);
	module.exports = function(iterator, fn, value, entries){
	  try {
	    return entries ? fn(anObject(value)[0], value[1]) : fn(value);
	  // 7.4.6 IteratorClose(iterator, completion)
	  } catch(e){
	    var ret = iterator['return'];
	    if(ret !== undefined)anObject(ret.call(iterator));
	    throw e;
	  }
	};

/***/ },
/* 95 */
/***/ function(module, exports, __webpack_require__) {

	// check on default Array iterator
	var Iterators  = __webpack_require__(33)
	  , ITERATOR   = __webpack_require__(51)('iterator')
	  , ArrayProto = Array.prototype;

	module.exports = function(it){
	  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
	};

/***/ },
/* 96 */
/***/ function(module, exports, __webpack_require__) {

	var classof   = __webpack_require__(91)
	  , ITERATOR  = __webpack_require__(51)('iterator')
	  , Iterators = __webpack_require__(33);
	module.exports = __webpack_require__(3).getIteratorMethod = function(it){
	  if(it != undefined)return it[ITERATOR]
	    || it['@@iterator']
	    || Iterators[classof(it)];
	};

/***/ },
/* 97 */
/***/ function(module, exports, __webpack_require__) {

	// 7.3.20 SpeciesConstructor(O, defaultConstructor)
	var anObject  = __webpack_require__(14)
	  , aFunction = __webpack_require__(11)
	  , SPECIES   = __webpack_require__(51)('species');
	module.exports = function(O, D){
	  var C = anObject(O).constructor, S;
	  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
	};

/***/ },
/* 98 */
/***/ function(module, exports, __webpack_require__) {

	var ctx                = __webpack_require__(10)
	  , invoke             = __webpack_require__(99)
	  , html               = __webpack_require__(49)
	  , cel                = __webpack_require__(19)
	  , global             = __webpack_require__(9)
	  , process            = global.process
	  , setTask            = global.setImmediate
	  , clearTask          = global.clearImmediate
	  , MessageChannel     = global.MessageChannel
	  , counter            = 0
	  , queue              = {}
	  , ONREADYSTATECHANGE = 'onreadystatechange'
	  , defer, channel, port;
	var run = function(){
	  var id = +this;
	  if(queue.hasOwnProperty(id)){
	    var fn = queue[id];
	    delete queue[id];
	    fn();
	  }
	};
	var listener = function(event){
	  run.call(event.data);
	};
	// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
	if(!setTask || !clearTask){
	  setTask = function setImmediate(fn){
	    var args = [], i = 1;
	    while(arguments.length > i)args.push(arguments[i++]);
	    queue[++counter] = function(){
	      invoke(typeof fn == 'function' ? fn : Function(fn), args);
	    };
	    defer(counter);
	    return counter;
	  };
	  clearTask = function clearImmediate(id){
	    delete queue[id];
	  };
	  // Node.js 0.8-
	  if(__webpack_require__(41)(process) == 'process'){
	    defer = function(id){
	      process.nextTick(ctx(run, id, 1));
	    };
	  // Browsers with MessageChannel, includes WebWorkers
	  } else if(MessageChannel){
	    channel = new MessageChannel;
	    port    = channel.port2;
	    channel.port1.onmessage = listener;
	    defer = ctx(port.postMessage, port, 1);
	  // Browsers with postMessage, skip WebWorkers
	  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
	  } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){
	    defer = function(id){
	      global.postMessage(id + '', '*');
	    };
	    global.addEventListener('message', listener, false);
	  // IE8-
	  } else if(ONREADYSTATECHANGE in cel('script')){
	    defer = function(id){
	      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){
	        html.removeChild(this);
	        run.call(id);
	      };
	    };
	  // Rest old browsers
	  } else {
	    defer = function(id){
	      setTimeout(ctx(run, id, 1), 0);
	    };
	  }
	}
	module.exports = {
	  set:   setTask,
	  clear: clearTask
	};

/***/ },
/* 99 */
/***/ function(module, exports) {

	// fast apply, http://jsperf.lnkit.com/fast-apply/5
	module.exports = function(fn, args, that){
	  var un = that === undefined;
	  switch(args.length){
	    case 0: return un ? fn()
	                      : fn.call(that);
	    case 1: return un ? fn(args[0])
	                      : fn.call(that, args[0]);
	    case 2: return un ? fn(args[0], args[1])
	                      : fn.call(that, args[0], args[1]);
	    case 3: return un ? fn(args[0], args[1], args[2])
	                      : fn.call(that, args[0], args[1], args[2]);
	    case 4: return un ? fn(args[0], args[1], args[2], args[3])
	                      : fn.call(that, args[0], args[1], args[2], args[3]);
	  } return              fn.apply(that, args);
	};

/***/ },
/* 100 */
/***/ function(module, exports, __webpack_require__) {

	var global    = __webpack_require__(9)
	  , macrotask = __webpack_require__(98).set
	  , Observer  = global.MutationObserver || global.WebKitMutationObserver
	  , process   = global.process
	  , Promise   = global.Promise
	  , isNode    = __webpack_require__(41)(process) == 'process';

	module.exports = function(){
	  var head, last, notify;

	  var flush = function(){
	    var parent, fn;
	    if(isNode && (parent = process.domain))parent.exit();
	    while(head){
	      fn   = head.fn;
	      head = head.next;
	      try {
	        fn();
	      } catch(e){
	        if(head)notify();
	        else last = undefined;
	        throw e;
	      }
	    } last = undefined;
	    if(parent)parent.enter();
	  };

	  // Node.js
	  if(isNode){
	    notify = function(){
	      process.nextTick(flush);
	    };
	  // browsers with MutationObserver
	  } else if(Observer){
	    var toggle = true
	      , node   = document.createTextNode('');
	    new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new
	    notify = function(){
	      node.data = toggle = !toggle;
	    };
	  // environments with maybe non-completely correct, but existent Promise
	  } else if(Promise && Promise.resolve){
	    var promise = Promise.resolve();
	    notify = function(){
	      promise.then(flush);
	    };
	  // for other environments - macrotask based on:
	  // - setImmediate
	  // - MessageChannel
	  // - window.postMessag
	  // - onreadystatechange
	  // - setTimeout
	  } else {
	    notify = function(){
	      // strange IE + webpack dev server bug - use .call(global)
	      macrotask.call(global, flush);
	    };
	  }

	  return function(fn){
	    var task = {fn: fn, next: undefined};
	    if(last)last.next = task;
	    if(!head){
	      head = task;
	      notify();
	    } last = task;
	  };
	};

/***/ },
/* 101 */
/***/ function(module, exports, __webpack_require__) {

	var hide = __webpack_require__(12);
	module.exports = function(target, src, safe){
	  for(var key in src){
	    if(safe && target[key])target[key] = src[key];
	    else hide(target, key, src[key]);
	  } return target;
	};

/***/ },
/* 102 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	var global      = __webpack_require__(9)
	  , core        = __webpack_require__(3)
	  , dP          = __webpack_require__(13)
	  , DESCRIPTORS = __webpack_require__(17)
	  , SPECIES     = __webpack_require__(51)('species');

	module.exports = function(KEY){
	  var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];
	  if(DESCRIPTORS && C && !C[SPECIES])dP.f(C, SPECIES, {
	    configurable: true,
	    get: function(){ return this; }
	  });
	};

/***/ },
/* 103 */
/***/ function(module, exports, __webpack_require__) {

	var ITERATOR     = __webpack_require__(51)('iterator')
	  , SAFE_CLOSING = false;

	try {
	  var riter = [7][ITERATOR]();
	  riter['return'] = function(){ SAFE_CLOSING = true; };
	  Array.from(riter, function(){ throw 2; });
	} catch(e){ /* empty */ }

	module.exports = function(exec, skipClosing){
	  if(!skipClosing && !SAFE_CLOSING)return false;
	  var safe = false;
	  try {
	    var arr  = [7]
	      , iter = arr[ITERATOR]();
	    iter.next = function(){ return {done: safe = true}; };
	    arr[ITERATOR] = function(){ return iter; };
	    exec(arr);
	  } catch(e){ /* empty */ }
	  return safe;
	};

/***/ },
/* 104 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(105), __esModule: true };

/***/ },
/* 105 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(106);
	module.exports = __webpack_require__(3).Object.getPrototypeOf;

/***/ },
/* 106 */
/***/ function(module, exports, __webpack_require__) {

	// 19.1.2.9 Object.getPrototypeOf(O)
	var toObject        = __webpack_require__(53)
	  , $getPrototypeOf = __webpack_require__(52);

	__webpack_require__(107)('getPrototypeOf', function(){
	  return function getPrototypeOf(it){
	    return $getPrototypeOf(toObject(it));
	  };
	});

/***/ },
/* 107 */
/***/ function(module, exports, __webpack_require__) {

	// most Object methods by ES6 should accept primitives
	var $export = __webpack_require__(8)
	  , core    = __webpack_require__(3)
	  , fails   = __webpack_require__(18);
	module.exports = function(KEY, exec){
	  var fn  = (core.Object || {})[KEY] || Object[KEY]
	    , exp = {};
	  exp[KEY] = exec(fn);
	  $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
	};

/***/ },
/* 108 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(109), __esModule: true };

/***/ },
/* 109 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(110);
	module.exports = __webpack_require__(3).Object.setPrototypeOf;

/***/ },
/* 110 */
/***/ function(module, exports, __webpack_require__) {

	// 19.1.3.19 Object.setPrototypeOf(O, proto)
	var $export = __webpack_require__(8);
	$export($export.S, 'Object', {setPrototypeOf: __webpack_require__(111).set});

/***/ },
/* 111 */
/***/ function(module, exports, __webpack_require__) {

	// Works with __proto__ only. Old v8 can't work with null proto objects.
	/* eslint-disable no-proto */
	var isObject = __webpack_require__(15)
	  , anObject = __webpack_require__(14);
	var check = function(O, proto){
	  anObject(O);
	  if(!isObject(proto) && proto !== null)throw TypeError(proto + ": can't set as prototype!");
	};
	module.exports = {
	  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
	    function(test, buggy, set){
	      try {
	        set = __webpack_require__(10)(Function.call, __webpack_require__(71).f(Object.prototype, '__proto__').set, 2);
	        set(test, []);
	        buggy = !(test instanceof Array);
	      } catch(e){ buggy = true; }
	      return function setPrototypeOf(O, proto){
	        check(O, proto);
	        if(buggy)O.__proto__ = proto;
	        else set(O, proto);
	        return O;
	      };
	    }({}, false) : undefined),
	  check: check
	};

/***/ },
/* 112 */
/***/ function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_RESULT__;;(function () {
		'use strict';

		/**
		 * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.
		 *
		 * @codingstandard ftlabs-jsv2
		 * @copyright The Financial Times Limited [All Rights Reserved]
		 * @license MIT License (see LICENSE.txt)
		 */

		/*jslint browser:true, node:true*/
		/*global define, Event, Node*/


		/**
		 * Instantiate fast-clicking listeners on the specified layer.
		 *
		 * @constructor
		 * @param {Element} layer The layer to listen on
		 * @param {Object} [options={}] The options to override the defaults
		 */
		function FastClick(layer, options) {
			var oldOnClick;

			options = options || {};

			/**
			 * Whether a click is currently being tracked.
			 *
			 * @type boolean
			 */
			this.trackingClick = false;


			/**
			 * Timestamp for when click tracking started.
			 *
			 * @type number
			 */
			this.trackingClickStart = 0;


			/**
			 * The element being tracked for a click.
			 *
			 * @type EventTarget
			 */
			this.targetElement = null;


			/**
			 * X-coordinate of touch start event.
			 *
			 * @type number
			 */
			this.touchStartX = 0;


			/**
			 * Y-coordinate of touch start event.
			 *
			 * @type number
			 */
			this.touchStartY = 0;


			/**
			 * ID of the last touch, retrieved from Touch.identifier.
			 *
			 * @type number
			 */
			this.lastTouchIdentifier = 0;


			/**
			 * Touchmove boundary, beyond which a click will be cancelled.
			 *
			 * @type number
			 */
			this.touchBoundary = options.touchBoundary || 10;


			/**
			 * The FastClick layer.
			 *
			 * @type Element
			 */
			this.layer = layer;

			/**
			 * The minimum time between tap(touchstart and touchend) events
			 *
			 * @type number
			 */
			this.tapDelay = options.tapDelay || 200;

			/**
			 * The maximum time for a tap
			 *
			 * @type number
			 */
			this.tapTimeout = options.tapTimeout || 700;

			if (FastClick.notNeeded(layer)) {
				return;
			}

			// Some old versions of Android don't have Function.prototype.bind
			function bind(method, context) {
				return function() { return method.apply(context, arguments); };
			}


			var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];
			var context = this;
			for (var i = 0, l = methods.length; i < l; i++) {
				context[methods[i]] = bind(context[methods[i]], context);
			}

			// Set up event handlers as required
			if (deviceIsAndroid) {
				layer.addEventListener('mouseover', this.onMouse, true);
				layer.addEventListener('mousedown', this.onMouse, true);
				layer.addEventListener('mouseup', this.onMouse, true);
			}

			layer.addEventListener('click', this.onClick, true);
			layer.addEventListener('touchstart', this.onTouchStart, false);
			layer.addEventListener('touchmove', this.onTouchMove, false);
			layer.addEventListener('touchend', this.onTouchEnd, false);
			layer.addEventListener('touchcancel', this.onTouchCancel, false);

			// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
			// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick
			// layer when they are cancelled.
			if (!Event.prototype.stopImmediatePropagation) {
				layer.removeEventListener = function(type, callback, capture) {
					var rmv = Node.prototype.removeEventListener;
					if (type === 'click') {
						rmv.call(layer, type, callback.hijacked || callback, capture);
					} else {
						rmv.call(layer, type, callback, capture);
					}
				};

				layer.addEventListener = function(type, callback, capture) {
					var adv = Node.prototype.addEventListener;
					if (type === 'click') {
						adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {
							if (!event.propagationStopped) {
								callback(event);
							}
						}), capture);
					} else {
						adv.call(layer, type, callback, capture);
					}
				};
			}

			// If a handler is already declared in the element's onclick attribute, it will be fired before
			// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and
			// adding it as listener.
			if (typeof layer.onclick === 'function') {

				// Android browser on at least 3.2 requires a new reference to the function in layer.onclick
				// - the old one won't work if passed to addEventListener directly.
				oldOnClick = layer.onclick;
				layer.addEventListener('click', function(event) {
					oldOnClick(event);
				}, false);
				layer.onclick = null;
			}
		}

		/**
		* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.
		*
		* @type boolean
		*/
		var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0;

		/**
		 * Android requires exceptions.
		 *
		 * @type boolean
		 */
		var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;


		/**
		 * iOS requires exceptions.
		 *
		 * @type boolean
		 */
		var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;


		/**
		 * iOS 4 requires an exception for select elements.
		 *
		 * @type boolean
		 */
		var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent);


		/**
		 * iOS 6.0-7.* requires the target element to be manually derived
		 *
		 * @type boolean
		 */
		var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent);

		/**
		 * BlackBerry requires exceptions.
		 *
		 * @type boolean
		 */
		var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;

		/**
		 * Determine whether a given element requires a native click.
		 *
		 * @param {EventTarget|Element} target Target DOM element
		 * @returns {boolean} Returns true if the element needs a native click
		 */
		FastClick.prototype.needsClick = function(target) {
			switch (target.nodeName.toLowerCase()) {

			// Don't send a synthetic click to disabled inputs (issue #62)
			case 'button':
			case 'select':
			case 'textarea':
				if (target.disabled) {
					return true;
				}

				break;
			case 'input':

				// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
				if ((deviceIsIOS && target.type === 'file') || target.disabled) {
					return true;
				}

				break;
			case 'label':
			case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames
			case 'video':
				return true;
			}

			return (/\bneedsclick\b/).test(target.className);
		};


		/**
		 * Determine whether a given element requires a call to focus to simulate click into element.
		 *
		 * @param {EventTarget|Element} target Target DOM element
		 * @returns {boolean} Returns true if the element requires a call to focus to simulate native click.
		 */
		FastClick.prototype.needsFocus = function(target) {
			switch (target.nodeName.toLowerCase()) {
			case 'textarea':
				return true;
			case 'select':
				return !deviceIsAndroid;
			case 'input':
				switch (target.type) {
				case 'button':
				case 'checkbox':
				case 'file':
				case 'image':
				case 'radio':
				case 'submit':
					return false;
				}

				// No point in attempting to focus disabled inputs
				return !target.disabled && !target.readOnly;
			default:
				return (/\bneedsfocus\b/).test(target.className);
			}
		};


		/**
		 * Send a click event to the specified element.
		 *
		 * @param {EventTarget|Element} targetElement
		 * @param {Event} event
		 */
		FastClick.prototype.sendClick = function(targetElement, event) {
			var clickEvent, touch;

			// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)
			if (document.activeElement && document.activeElement !== targetElement) {
				document.activeElement.blur();
			}

			touch = event.changedTouches[0];

			// Synthesise a click event, with an extra attribute so it can be tracked
			clickEvent = document.createEvent('MouseEvents');
			clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
			clickEvent.forwardedTouchEvent = true;
			targetElement.dispatchEvent(clickEvent);
		};

		FastClick.prototype.determineEventType = function(targetElement) {

			//Issue #159: Android Chrome Select Box does not open with a synthetic click event
			if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {
				return 'mousedown';
			}

			return 'click';
		};


		/**
		 * @param {EventTarget|Element} targetElement
		 */
		FastClick.prototype.focus = function(targetElement) {
			var length;

			// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.
			if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') {
				length = targetElement.value.length;
				targetElement.setSelectionRange(length, length);
			} else {
				targetElement.focus();
			}
		};


		/**
		 * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.
		 *
		 * @param {EventTarget|Element} targetElement
		 */
		FastClick.prototype.updateScrollParent = function(targetElement) {
			var scrollParent, parentElement;

			scrollParent = targetElement.fastClickScrollParent;

			// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the
			// target element was moved to another parent.
			if (!scrollParent || !scrollParent.contains(targetElement)) {
				parentElement = targetElement;
				do {
					if (parentElement.scrollHeight > parentElement.offsetHeight) {
						scrollParent = parentElement;
						targetElement.fastClickScrollParent = parentElement;
						break;
					}

					parentElement = parentElement.parentElement;
				} while (parentElement);
			}

			// Always update the scroll top tracker if possible.
			if (scrollParent) {
				scrollParent.fastClickLastScrollTop = scrollParent.scrollTop;
			}
		};


		/**
		 * @param {EventTarget} targetElement
		 * @returns {Element|EventTarget}
		 */
		FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {

			// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.
			if (eventTarget.nodeType === Node.TEXT_NODE) {
				return eventTarget.parentNode;
			}

			return eventTarget;
		};


		/**
		 * On touch start, record the position and scroll offset.
		 *
		 * @param {Event} event
		 * @returns {boolean}
		 */
		FastClick.prototype.onTouchStart = function(event) {
			var targetElement, touch, selection;

			// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).
			if (event.targetTouches.length > 1) {
				return true;
			}

			targetElement = this.getTargetElementFromEventTarget(event.target);
			touch = event.targetTouches[0];
			//FIXME 修改select在iOS中闪退的bug
			var nodeName = targetElement.nodeName.toLowerCase();
			var typeAttribute = targetElement.getAttribute('type');
			if (nodeName === "select" || (typeAttribute === 'date' && nodeName === "input") || (typeAttribute === 'datetime' && nodeName === "input")){
					return false;
			}

			if (deviceIsIOS) {

				// Only trusted events will deselect text on iOS (issue #49)
				selection = window.getSelection();
				if (selection.rangeCount && !selection.isCollapsed) {
					return true;
				}

				if (!deviceIsIOS4) {

					// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):
					// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched
					// with the same identifier as the touch event that previously triggered the click that triggered the alert.
					// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an
					// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.
					// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,
					// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,
					// random integers, it's safe to to continue if the identifier is 0 here.
					if (touch.identifier && touch.identifier === this.lastTouchIdentifier) {
						event.preventDefault();
						return false;
					}

					this.lastTouchIdentifier = touch.identifier;

					// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:
					// 1) the user does a fling scroll on the scrollable layer
					// 2) the user stops the fling scroll with another tap
					// then the event.target of the last 'touchend' event will be the element that was under the user's finger
					// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check
					// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).
					this.updateScrollParent(targetElement);
				}
			}

			this.trackingClick = true;
			this.trackingClickStart = event.timeStamp;
			this.targetElement = targetElement;

			this.touchStartX = touch.pageX;
			this.touchStartY = touch.pageY;

			// Prevent phantom clicks on fast double-tap (issue #36)
			if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
				event.preventDefault();
			}

			return true;
		};


		/**
		 * Based on a touchmove event object, check whether the touch has moved past a boundary since it started.
		 *
		 * @param {Event} event
		 * @returns {boolean}
		 */
		FastClick.prototype.touchHasMoved = function(event) {
			var touch = event.changedTouches[0], boundary = this.touchBoundary;

			if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {
				return true;
			}

			return false;
		};


		/**
		 * Update the last position.
		 *
		 * @param {Event} event
		 * @returns {boolean}
		 */
		FastClick.prototype.onTouchMove = function(event) {
			if (!this.trackingClick) {
				return true;
			}

			// If the touch has moved, cancel the click tracking
			if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {
				this.trackingClick = false;
				this.targetElement = null;
			}

			return true;
		};


		/**
		 * Attempt to find the labelled control for the given label element.
		 *
		 * @param {EventTarget|HTMLLabelElement} labelElement
		 * @returns {Element|null}
		 */
		FastClick.prototype.findControl = function(labelElement) {

			// Fast path for newer browsers supporting the HTML5 control attribute
			if (labelElement.control !== undefined) {
				return labelElement.control;
			}

			// All browsers under test that support touch events also support the HTML5 htmlFor attribute
			if (labelElement.htmlFor) {
				return document.getElementById(labelElement.htmlFor);
			}

			// If no for attribute exists, attempt to retrieve the first labellable descendant element
			// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label
			return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');
		};


		/**
		 * On touch end, determine whether to send a click event at once.
		 *
		 * @param {Event} event
		 * @returns {boolean}
		 */
		FastClick.prototype.onTouchEnd = function(event) {
			var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;

			if (!this.trackingClick) {
				return true;
			}

			// Prevent phantom clicks on fast double-tap (issue #36)
			if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
				this.cancelNextClick = true;
				return true;
			}

			if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {
				return true;
			}

			// Reset to prevent wrong click cancel on input (issue #156).
			this.cancelNextClick = false;

			this.lastClickTime = event.timeStamp;

			trackingClickStart = this.trackingClickStart;
			this.trackingClick = false;
			this.trackingClickStart = 0;

			// On some iOS devices, the targetElement supplied with the event is invalid if the layer
			// is performing a transition or scroll, and has to be re-detected manually. Note that
			// for this to function correctly, it must be called *after* the event target is checked!
			// See issue #57; also filed as rdar://13048589 .
			if (deviceIsIOSWithBadTarget) {
				touch = event.changedTouches[0];

				// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null
				targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;
				targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;
			}

			targetTagName = targetElement.tagName.toLowerCase();
			if (targetTagName === 'label') {
				forElement = this.findControl(targetElement);
				if (forElement) {
					this.focus(targetElement);
					if (deviceIsAndroid) {
						return false;
					}

					targetElement = forElement;
				}
			} else if (this.needsFocus(targetElement)) {

				// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.
				// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).
				if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {
					this.targetElement = null;
					return false;
				}

				this.focus(targetElement);
				this.sendClick(targetElement, event);

				// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.
				// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)
				if (!deviceIsIOS || targetTagName !== 'select') {
					this.targetElement = null;
					event.preventDefault();
				}

				return false;
			}

			if (deviceIsIOS && !deviceIsIOS4) {

				// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled
				// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).
				scrollParent = targetElement.fastClickScrollParent;
				if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {
					return true;
				}
			}

			// Prevent the actual click from going though - unless the target node is marked as requiring
			// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.
			if (!this.needsClick(targetElement)) {
				event.preventDefault();
				this.sendClick(targetElement, event);
			}

			return false;
		};


		/**
		 * On touch cancel, stop tracking the click.
		 *
		 * @returns {void}
		 */
		FastClick.prototype.onTouchCancel = function() {
			this.trackingClick = false;
			this.targetElement = null;
		};


		/**
		 * Determine mouse events which should be permitted.
		 *
		 * @param {Event} event
		 * @returns {boolean}
		 */
		FastClick.prototype.onMouse = function(event) {

			// If a target element was never set (because a touch event was never fired) allow the event
			if (!this.targetElement) {
				return true;
			}

			if (event.forwardedTouchEvent) {
				return true;
			}

			// Programmatically generated events targeting a specific element should be permitted
			if (!event.cancelable) {
				return true;
			}

			// Derive and check the target element to see whether the mouse event needs to be permitted;
			// unless explicitly enabled, prevent non-touch click events from triggering actions,
			// to prevent ghost/doubleclicks.
			if (!this.needsClick(this.targetElement) || this.cancelNextClick) {

				// Prevent any user-added listeners declared on FastClick element from being fired.
				if (event.stopImmediatePropagation) {
					event.stopImmediatePropagation();
				} else {

					// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
					event.propagationStopped = true;
				}

				// Cancel the event
				event.stopPropagation();
				event.preventDefault();

				return false;
			}

			// If the mouse event is permitted, return true for the action to go through.
			return true;
		};


		/**
		 * On actual clicks, determine whether this is a touch-generated click, a click action occurring
		 * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or
		 * an actual click which should be permitted.
		 *
		 * @param {Event} event
		 * @returns {boolean}
		 */
		FastClick.prototype.onClick = function(event) {
			var permitted;

			// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.
			if (this.trackingClick) {
				this.targetElement = null;
				this.trackingClick = false;
				return true;
			}

			// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.
			if (event.target.type === 'submit' && event.detail === 0) {
				return true;
			}

			permitted = this.onMouse(event);

			// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.
			if (!permitted) {
				this.targetElement = null;
			}

			// If clicks are permitted, return true for the action to go through.
			return permitted;
		};


		/**
		 * Remove all FastClick's event listeners.
		 *
		 * @returns {void}
		 */
		FastClick.prototype.destroy = function() {
			var layer = this.layer;

			if (deviceIsAndroid) {
				layer.removeEventListener('mouseover', this.onMouse, true);
				layer.removeEventListener('mousedown', this.onMouse, true);
				layer.removeEventListener('mouseup', this.onMouse, true);
			}

			layer.removeEventListener('click', this.onClick, true);
			layer.removeEventListener('touchstart', this.onTouchStart, false);
			layer.removeEventListener('touchmove', this.onTouchMove, false);
			layer.removeEventListener('touchend', this.onTouchEnd, false);
			layer.removeEventListener('touchcancel', this.onTouchCancel, false);
		};


		/**
		 * Check whether FastClick is needed.
		 *
		 * @param {Element} layer The layer to listen on
		 */
		FastClick.notNeeded = function(layer) {
			var metaViewport;
			var chromeVersion;
			var blackberryVersion;
			var firefoxVersion;

			// Devices that don't support touch don't need FastClick
			if (typeof window.ontouchstart === 'undefined') {
				return true;
			}

			// Chrome version - zero for other browsers
			chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];

			if (chromeVersion) {

				if (deviceIsAndroid) {
					metaViewport = document.querySelector('meta[name=viewport]');

					if (metaViewport) {
						// Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89)
						if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
							return true;
						}
						// Chrome 32 and above with width=device-width or less don't need FastClick
						if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {
							return true;
						}
					}

				// Chrome desktop doesn't need FastClick (issue #15)
				} else {
					return true;
				}
			}

			if (deviceIsBlackBerry10) {
				blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/);

				// BlackBerry 10.3+ does not require Fastclick library.
				// https://github.com/ftlabs/fastclick/issues/251
				if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {
					metaViewport = document.querySelector('meta[name=viewport]');

					if (metaViewport) {
						// user-scalable=no eliminates click delay.
						if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
							return true;
						}
						// width=device-width (or less than device-width) eliminates click delay.
						if (document.documentElement.scrollWidth <= window.outerWidth) {
							return true;
						}
					}
				}
			}

			// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)
			if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {
				return true;
			}

			// Firefox version - zero for other browsers
			firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];

			if (firefoxVersion >= 27) {
				// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896

				metaViewport = document.querySelector('meta[name=viewport]');
				if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {
					return true;
				}
			}

			// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version
			// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx
			if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {
				return true;
			}

			return false;
		};


		/**
		 * Factory method for creating a FastClick object
		 *
		 * @param {Element} layer The layer to listen on
		 * @param {Object} [options={}] The options to override the defaults
		 */
		FastClick.attach = function(layer, options) {
			return new FastClick(layer, options);
		};


		if (true) {

			// AMD. Register as an anonymous module.
			!(__WEBPACK_AMD_DEFINE_RESULT__ = function() {
				return FastClick;
			}.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
		} else if (typeof module !== 'undefined' && module.exports) {
			module.exports = FastClick.attach;
			module.exports.FastClick = FastClick;
		} else {
			window.FastClick = FastClick;
		}
	}());


/***/ },
/* 113 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";

	Object.defineProperty(exports, "__esModule", {
	  value: true
	});

	__webpack_require__(114);

	exports.default = {
	  getTemplate: function getTemplate(name) {
	    if (name) {
	      return __webpack_require__(119)("./" + name);
	    }
	  },

	  // view contains
	  getView: function getView(name) {

	    // return require('./view/' + name);
	  },

	  getPage: function getPage(name) {
	    return __webpack_require__(124)("./" + name);
	  }

	}; //加载模版 js 等

/***/ },
/* 114 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	__webpack_require__(115);

	__webpack_require__(116);

	__webpack_require__(117);

	__webpack_require__(118);

/***/ },
/* 115 */
/***/ function(module, exports) {

	"use strict";

	//给application扩展功能 如modal提示 ajax请求等

	window.application = {};

/***/ },
/* 116 */
/***/ function(module, exports) {

	"use strict";

	Date.prototype.format = function (format) {
	  var o = {
	    "M+": this.getMonth() + 1, //month
	    "d+": this.getDate(), //day
	    "H+": this.getHours() + 1, //hour
	    "h+": this.getHours(), //hour
	    "m+": this.getMinutes(), //minute
	    "s+": this.getSeconds(), //second
	    "q+": Math.floor((this.getMonth() + 3) / 3), //quarter
	    "S": this.getMilliseconds(), //millisecond
	    "w+": this.getDay()
	  };
	  var weekday = new Array(7);
	  weekday[0] = "周日";
	  weekday[1] = "周一";
	  weekday[2] = "周二";
	  weekday[3] = "周三";
	  weekday[4] = "周四";
	  weekday[5] = "周五";
	  weekday[6] = "周六";
	  if (/(y+)/.test(format)) {
	    format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
	  }
	  for (var k in o) {
	    // console.log(k);

	    if (new RegExp("(" + k + ")").test(format)) {
	      if (k == "w+") {
	        format = format.replace(RegExp.$1, weekday[o[k]]);
	      } else {
	        format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
	      }
	    }
	  }
	  return format;
	};

/***/ },
/* 117 */
/***/ function(module, exports, __webpack_require__) {

	var __WEBPACK_AMD_DEFINE_RESULT__;'use strict';

	var _typeof2 = __webpack_require__(22);

	var _typeof3 = _interopRequireDefault(_typeof2);

	var _stringify = __webpack_require__(1);

	var _stringify2 = _interopRequireDefault(_stringify);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	(function (root) {
	    var ua = window.navigator.userAgent;
	    //桥接器的命名空间
	    var ns = {
	        _initialized: false,
	        // 探测操作系统浏览器
	        ios: /iPhone|iPad|iPod/i.test(ua),
	        android: /Android/i.test(ua),
	        version: "0.0.2",
	        config: function config(obj) {
	            var bridge = root.WebViewJavascriptBridge;
	            var sendObj = {
	                function: 'permissionVerify',
	                parameters: obj
	            };
	            bridge.send((0, _stringify2.default)(sendObj), function (responseData) {});
	        },
	        //下面bridge中的各项请求参数中如有callback,需要通过此函数先行注册才能生效.
	        register: function register(obj) {
	            var bridge = root.WebViewJavascriptBridge;
	            if ((typeof obj === 'undefined' ? 'undefined' : (0, _typeof3.default)(obj)) === 'object' && ns._initialized) {
	                for (var key in obj) {
	                    if (typeof obj[key] === 'function') {
	                        bridge.registerHandler(key, obj[key]);
	                    } else {
	                        alert('注册的必须为函数');
	                    }
	                }
	            } else {
	                alert('请检查参数是否正确且是否已初始化');
	            }
	        },
	        // 由于桥的初始化需要时间，不知道是否已经ok，这适用于在开始就要执行的bridge函数
	        // 桥接器的ready函数，只在初始化的时候才调用，先把回调函数都追加到一个列表中
	        ready: function ready(callback) {
	            if (callback) {
	                if (ns._initialized) {
	                    // 立即执行
	                    callback();
	                } else {
	                    // 延迟执行添加到缓存队列中
	                    ns.readycallback.push(callback);
	                }
	            }
	        },
	        readycallback: []
	    };

	    // 构造一个回调函数
	    var wrapMethod = function wrapMethod(data) {
	        // 第一个参数为原生功能调用完成的callback，经常用
	        // 第二个参数为原生功能在使用过程中需要调用的回调
	        var ret = function ret(callback, parameters) {
	            var bridge = root.WebViewJavascriptBridge;
	            if (ns._initialized) {
	                if (!callback) {
	                    // the default callback to fullfill bridge's requirement
	                    callback = function callback(responseData) {};
	                }
	                if ((typeof callback === 'undefined' ? 'undefined' : (0, _typeof3.default)(callback)) === 'object') {
	                    parameters = callback;
	                    callback = function callback(responseData) {};
	                }
	                // 检查额外的参数，并且合并
	                if (parameters && (typeof parameters === 'undefined' ? 'undefined' : (0, _typeof3.default)(parameters)) === 'object') {
	                    if (data.parameters) {
	                        // 合并参数
	                        for (var key in parameters) {
	                            data.parameters[key] = parameters[key];
	                        }
	                    } else {
	                        data.parameters = parameters;
	                    }
	                } else {}
	                bridge.send((0, _stringify2.default)(data), function (responseData) {
	                    //转换为js对象
	                    callback(JSON.parse(responseData));
	                });
	            } else {
	                ns.readycallback.push({ fn: ret, args: arguments });
	                console.log("js bridge has not been initialized yet.");
	            }
	        };
	        return ret;
	    };
	    // generate function in the namespace
	    var generator = function generator(ns) {
	        // 定义桥调用协议
	        var methods = {
	            //native客户端接口
	            client: {
	                //隐藏头部导航
	                "hiddenMenu": {
	                    function: 'hiddenMenu'
	                },
	                //关闭webview
	                "closePage": {
	                    function: 'closePage'
	                },
	                //设置企业空间标题
	                "setHeader": {
	                    function: 'navRightItemList'
	                },
	                //扫码一次
	                "scanQRCode": {
	                    function: 'scanQRCode',
	                    parameters: {
	                        type: 0,
	                        callback: 'scanQRCodeCallback'
	                    }
	                },
	                //连续扫码
	                "scanQRCodeMore": {
	                    function: 'scanQRCode',
	                    parameters: {
	                        type: 1,
	                        callback: 'scanQRCodeCallback'
	                    }
	                },
	                //打开新的窗口
	                "openWindow": {
	                    function: 'openWindow'
	                },
	                "selectDate": {
	                    function: 'selectDate'
	                },
	                "selectList": {
	                    function: 'selectList'
	                },
	                "selectAttachment": {
	                    function: 'selectAttachment'
	                },
	                "selectCity": {
	                    function: 'selectCity'
	                },
	                "selectMap": {
	                    function: 'selectMap'
	                },
	                "copyText": {
	                    function: 'copyText'
	                },
	                "configNavigationBar": {
	                    function: 'configNavigationBar'
	                },
	                "share": {
	                    function: 'share'
	                },
	                "viewOrDeleteImage": {
	                    function: 'viewOrDeleteImage'
	                },
	                "viewImage": {
	                    function: 'viewImage'
	                },
	                "previewFile": {
	                    function: 'previewFile'
	                },
	                "getLocation": {
	                    function: 'getLocation'
	                },
	                "vibrate": {
	                    function: 'vibrate'
	                },
	                "getShaking": {
	                    function: 'getShaking'

	                },
	                "getStepCount": {
	                    function: 'getStepCount'

	                },
	                "getScreenshot": {
	                    function: 'getScreenshot'

	                },
	                "configNavBar": {
	                    function: 'configNavBar'

	                },
	                "payResult": {
	                    function: 'payResult'

	                },
	                "getStepServiceStatus": {},
	                "stopOrStartStepService": {
	                    function: 'stopOrStartStepService'

	                }

	            },
	            //企业相关信息接口
	            enterprise: {
	                "openApp": {
	                    function: 'openAPP'
	                },
	                "selectContacts": {
	                    function: 'selectContacts'
	                },
	                "callUer": {
	                    function: 'callUer'
	                },
	                "bindPhone": {
	                    function: 'bindPhone'
	                },
	                "feedReply": {
	                    function: 'feedReply'
	                },
	                "sendMemail": {
	                    function: 'sendMemail'
	                },
	                "sendMessage": {
	                    function: 'sendMessage'
	                },
	                "callUsers": {
	                    function: 'callUsers'
	                },
	                "selectGroup": {
	                    function: 'selectGroup'
	                },
	                "processAt": {
	                    function: 'processAt'
	                },
	                "viewUser": {
	                    function: 'viewUser'
	                },
	                "openChatWindow": {
	                    function: 'openChatWindow'
	                },
	                "createFeed": {
	                    function: 'createFeed'
	                },
	                "viewTaskLog": {
	                    function: 'viewTaskLog'
	                },
	                "viewTaskUser": {
	                    function: 'viewTaskUser'
	                },
	                "createOredit": {
	                    function: 'createOredit'
	                },
	                "taskComment": {
	                    function: 'taskComment'
	                },
	                "feedDataUpdate": {
	                    function: 'feedDataUpdate'
	                }
	            }
	        };
	        // 根据方法定义生成方法

	        for (var category in methods) {
	            ns[category] = {};
	            for (var method in methods[category]) {
	                var data = methods[category][method];
	                ns[category][method] = wrapMethod(data);
	            }
	        }

	        // other special method
	    };
	    //生成方法对象
	    generator(ns);
	    // 初始化函数
	    var connectWebViewJavascriptBridge = function connectWebViewJavascriptBridge(callback) {
	        if (window.WebViewJavascriptBridge) {
	            callback(WebViewJavascriptBridge);
	        } else {
	            document.addEventListener('WebViewJavascriptBridgeReady', function () {
	                callback(WebViewJavascriptBridge);
	            }, false);
	        }
	    };
	    // 初始化JS Bridge
	    connectWebViewJavascriptBridge(function (bridge) {
	        try {
	            bridge.init(function (message, responseCallback) {});
	            // 确保桥接器绑定到window对象
	            if (!window.WebViewJavascriptBridge) {
	                window.WebViewJavascriptBridge = bridge;
	            }
	            // 如果有延迟执行回调的情况，执行它
	            ns._initialized = true; // 标识为已经初始化
	            // 生成函数
	            //generator(ns, bridge);

	            if (ns.readycallback.length) {
	                ns.readycallback.forEach(function (callbackObj) {
	                    if ((typeof callbackObj === 'undefined' ? 'undefined' : (0, _typeof3.default)(callbackObj)) === 'object') {
	                        var args = callbackObj.args;
	                        var fn = callbackObj.fn;
	                        switch (args.length) {
	                            case 0:
	                                fn();
	                                break;
	                            case 1:
	                                fn(args[0]);
	                                break;
	                            case 2:
	                                fn(args[0], args[1]);
	                                break;
	                            default:
	                                fn(args[0], args[1], args[2]);
	                        }
	                    } else if (typeof callbackObj === 'function') {
	                        callbackObj();
	                    } else {
	                        alert('参数错误!');
	                    }
	                });
	                ns.readycallback = [];
	            }
	        } catch (e) {
	            alert('错误信息:' + e);
	        }
	    });

	    window.yyesn = root.yyesn = ns;
	    // 绑定到全局对象上
	    // 不推荐使用模块加载器加载使用,jsbridge需要在页面开始时初始化,然后即可调用

	    if (true) {
	        !(__WEBPACK_AMD_DEFINE_RESULT__ = function () {
	            return ns;
	        }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
	    } else if ((typeof module === 'undefined' ? 'undefined' : (0, _typeof3.default)(module)) === 'object' && (0, _typeof3.default)(module.exports) === 'object') {
	        module.exports = ns;
	    }
	})(window);

/***/ },
/* 118 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";

	var _stringify = __webpack_require__(1);

	var _stringify2 = _interopRequireDefault(_stringify);

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	var http = {
	    ajax: function ajax(options) {
	        $.ajax(options);
	    },
	    sendAjax: function sendAjax(options) {
	        var params = this.getRequestParams(options.service, options.data);
	        //对params进行stringify后 进行加密
	        var opt = {
	            url: "/api/",
	            type: options.type || "POST",
	            data: (0, _stringify2.default)(params),
	            dataType: "json",
	            contentType: "application/x-www-form-urlencoded",
	            timeout: 10000,
	            success: function success(res) {
	                //parse成json
	                try {
	                    if (typeof res == "string") {
	                        res = JSON.parse(res);
	                    }
	                    if (res && res.flag == 0) {
	                        options.success && options.success(res.response);
	                    } else {
	                        //具体信息可能要经过前端优化处理 交给业务具体处理
	                        options.error && options.error(res);
	                    }
	                } catch (e) {
	                    window.R.toast && window.R.toast("请求失败");
	                    options.error && options.error({});
	                }
	            },
	            error: function error(res) {
	                window.R.toast && window.R.toast("请求失败");
	                console.log(res);
	                options.error && options.error({});
	            }
	        };
	        this.ajax(opt);
	    },
	    getRequestParams: function getRequestParams(service, params) {
	        var staticParams = {
	            uid: "", //TODO需要从应用传递uid过来,目前固定死一个
	            port: this.getPlatform(),
	            appvertion: "63",
	            cursize: 0,
	            requestsize: 100
	        };
	        for (var key in params) {
	            staticParams[key] = params[key];
	        }
	        var data = {
	            serverid: {
	                method: service
	            },
	            param: staticParams
	        };
	        return data;
	    },
	    getPlatform: function getPlatform() {
	        var u = navigator.userAgent;
	        var isiOS = /ipad|iphone|mac/i.test(navigator.userAgent); //ios终端
	        if (isiOS) {
	            return 0;
	        }
	        return 1;
	    }
	};

	_underscore2.default.extend(window.application, http);

	//测试代码
	// var options = {
	//   service:"GetAllrooms",
	//   data:{},
	//   success:function(res){
	//       console.log(res);
	//   },
	//   error:function(err){
	//     console.log(err);
	//   }
	// }
	// application.sendAjax(options);

/***/ },
/* 119 */
/***/ function(module, exports, __webpack_require__) {

	var map = {
		"./Detail.html": 120,
		"./List.html": 121,
		"./NewIndex.html": 123
	};
	function webpackContext(req) {
		return __webpack_require__(webpackContextResolve(req));
	};
	function webpackContextResolve(req) {
		return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }());
	};
	webpackContext.keys = function webpackContextKeys() {
		return Object.keys(map);
	};
	webpackContext.resolve = webpackContextResolve;
	module.exports = webpackContext;
	webpackContext.id = 119;


/***/ },
/* 120 */
/***/ function(module, exports) {

	module.exports = "<div class=\"mui-scroll\">\n  <div class=\"detail-content\">\n    <div class=\"detail-head\">\n\n    </div>\n    <div class=\"detail-middle\">\n      <div class=\"detail-item\">\n        <span class=\"detail-identify\">*</span>\n        <span class=\"middle-title\">主题</span>\n        <input type=\"text\" placeholder=\"主题(30字以内)\" name=\"theme\" maxlength=\"30\"/>\n      </div>\n      <div class=\"detail-item\">\n        <span class=\"middle-title\">人数</span>\n        <input type=\"text\" placeholder=\"人数\" class=\"num\"/>\n      </div>\n      <div class=\"detail-multiline\">\n        <span class=\"middle-title\" style=\"margin-right: 11px;\">内容</span>\n        <textarea style=\"margin-top:-2px\" class=\"middle-area\" placeholder=\"内容(200字以内)\" name=\"details\" maxlength=\"200\"></textarea>\n      </div>\n      <div class=\"detail-separate\">\n        参会人员\n      </div>\n      <div class=\"detail-member\">\n        <ul class=\"detail-member-ul\">\n          <li>\n            <span class=\"icon-add\"></span>\n          </li>\n        </ul>\n      </div>\n    </div>\n    <div class=\"detail-btn-item\">\n      <button class=\"detail-button\">提交</button>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 121 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = "<div class=\"mui-scroll\">\n  <div class=\"list-content\">\n    <ul class=\"list-ul\">\n\n    </ul>\n    <div class=\"nosearch-img-w\">\n      <img src=\"" + __webpack_require__(122) + "\">\n      <div>会议室已经用完啦...</div>\n    </div>\n  </div>\n</div>\n";

/***/ },
/* 122 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = __webpack_require__.p + "e622fddfd2d9f17f46051822d49834be.png";

/***/ },
/* 123 */
/***/ function(module, exports) {

	module.exports = "<div class=\"mui-scroll\">\n  <div class=\"m-date flex m-item\">\n    <label>预定日期</label>\n    <div>\n      <span class=\"value-txt\"></span>\n      <span class=\"icon-back2\"></span>\n    </div>\n  </div>\n  <div class=\"time-wrapper\">\n    <div class=\"start-time flex m-item\">\n      <label>开始时间</label>\n      <div>\n        <span class=\"value-txt\"></span>\n        <span class=\"icon-back2\"></span>\n      </div>\n    </div>\n    <div class=\"end-time flex m-item\">\n      <label>结束时间</label>\n      <div>\n        <span class=\"value-txt\"></span>\n        <span class=\"icon-back2\"></span>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"address flex m-item\">\n    <label>地址</label>\n    <div>\n      <span class=\"value-txt\">全部</span>\n      <span class=\"icon-back2\"></span>\n    </div>\n  </div>\n\n  <button type=\"button\" class=\"search-btn-block\">搜索</button>\n\n</div>\n\n<div class=\"loading-wrapper\">\n  <div class=\"loader-inner ball-clip-rotate-multiple\">\n          <div></div>\n          <div></div>\n    </div>\n</div>\n";

/***/ },
/* 124 */
/***/ function(module, exports, __webpack_require__) {

	var map = {
		"./Detail": 125,
		"./Detail.js": 125,
		"./List": 129,
		"./List.js": 129,
		"./NewIndex": 130,
		"./NewIndex.js": 130
	};
	function webpackContext(req) {
		return __webpack_require__(webpackContextResolve(req));
	};
	function webpackContextResolve(req) {
		return map[req] || (function() { throw new Error("Cannot find module '" + req + "'.") }());
	};
	webpackContext.keys = function webpackContextKeys() {
		return Object.keys(map);
	};
	webpackContext.resolve = webpackContextResolve;
	module.exports = webpackContext;
	webpackContext.id = 124;


/***/ },
/* 125 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	Object.defineProperty(exports, "__esModule", {
	  value: true
	});

	var _PageView = __webpack_require__(126);

	var _PageView2 = _interopRequireDefault(_PageView);

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	var Detail = _PageView2.default.extend({
	  area: "Detail",

	  initialize: function initialize() {
	    window.yyesn.client.setHeader({ title: "预定详情", navColor: "#FD746E" });

	    this.$el.on("click", ".detail-btn-item", this.applyRoom.bind(this));

	    this.$el.on("click", ".icon-add", this.selectContacts.bind(this));

	    this.contactsList = [];
	    this.userInfo = window._userInfo || {};

	    this.randomc = ["#29d4ff", "#1594ff", "#ffa92f", "#b587fa", "#06cf86", "#fa6771", "#73d51c", "#8991ff"];
	  },
	  didRender: function didRender() {
	    this.detailHeaderEl = this.el.querySelector(".detail-head");
	    this.detailUlEl = this.el.querySelector(".detail-member-ul");

	    this.loadingEl = this.el.querySelector(".loading-wrapper");

	    //render
	    this.renderApplyUser();
	  },
	  onResume: function onResume() {
	    window.yyesn.client.setHeader({ title: "预定详情", navColor: "#FD746E" });
	    //初始化单页的区域滚动
	    R('.mui-scroll-wrapper').scroll({
	      indicators: false,
	      deceleration: 0.0001
	    });
	    //render
	    this.contactsList = [];
	    this.renderApplyUser();
	  },
	  renderApplyUser: function renderApplyUser() {
	    if (window._userInfo) {
	      this.contactsList.push(window._userInfo);
	      this.renderContacts();
	    }
	  },
	  renderContacts: function renderContacts() {
	    var elHtml = [];
	    for (var i = 0; i < this.contactsList.length; i++) {
	      var each = this.contactsList[i];
	      var li = '\n        <li>\n          <img src="' + each.avatar + '">\n        </li>\n        ';
	      if (!each.avatar) {
	        var randomc = this.randomc[+_underscore2.default.random(0, 7)];
	        var name = each.name.length > 2 ? each.name.substring(1) : each.name;
	        li = '\n          <li>\n              <span class=default-avatar style=background:' + randomc + '>' + name + '</span>\n          </li>\n          ';
	      }
	      elHtml.push(li);
	    }
	    elHtml.push('<li><span class="icon-add"></span></li>');
	    this.detailUlEl.innerHTML = elHtml.join("");
	  },
	  selectContactsEnd: function selectContactsEnd(data) {
	    if (data.error_code == 0) {
	      // alert(JSON.stringify(data));
	      this.contactsList = data.data;
	      // var index = _.findIndex(this.contactsList, function(each){ return each.id == 123})
	      // if (index == -1) {
	      //   this.contactsList.push(this.applyUser)
	      // }
	      this.renderContacts();
	    }
	  },
	  selectContacts: function selectContacts() {
	    var self = this;
	    window.yyesn.enterprise.selectContacts(function (data) {
	      // alert(JSON.stringify(data));
	      self.selectContactsEnd(data);
	    }, {
	      nav_title: '选择联系人',
	      nav_color: '#FD746E',
	      select_list: self.contactsList
	    });
	  },
	  postRoute: function postRoute(options) {
	    if (options) {
	      this.routeParam = options;
	      this.renderHeader(options);
	      this.renderNum(options);
	    }
	  },
	  renderNum: function renderNum(options) {
	    var max = options.curentRoom.roommum;
	    this.$el.find(".num").attr("max", max);
	    this.$el.find(".num").attr("placeholder", "人数(" + max + "人以内)");
	  },
	  calculatePrice: function calculatePrice(cost, stime, endtime, day) {
	    stime = (day + " " + stime).replace(/-/g, "/");
	    endtime = (day + " " + endtime).replace(/-/g, "/");
	    var bookHour = (Date.parse(endtime) - Date.parse(stime)) / (60 * 60 * 1000);
	    // console.log(bookHour);
	    return +cost * bookHour;
	  },
	  renderHeader: function renderHeader(options) {
	    var day = options.timeData.time.substring(options.timeData.time.indexOf("-") + 1);
	    var time = options.timeData.Stime + "-" + options.timeData.Etime;
	    this.totalPrice = this.calculatePrice(options.curentRoom.cost, options.timeData.Stime, options.timeData.Etime, options.timeData.time);
	    this.totalPrice = /(^[1-9]\d*$)/.test(this.totalPrice) ? this.totalPrice : this.totalPrice.toFixed(1);

	    var html = '\n      <div>\n        <span class="detail-title">' + options.curentRoom.room + '</span>\n        <span class="detail-money">合计:￥' + this.totalPrice + '元</span>\n      </div>\n      <div class="detail-capacity"> ' + day + ' ' + time + '\n      </div>\n    ';
	    this.detailHeaderEl.innerHTML = html;
	  },

	  getAttendee: function getAttendee() {
	    return _underscore2.default.map(this.contactsList, function (each) {
	      return each.email || "";
	    });
	  },
	  applyRoom: function applyRoom() {
	    var number = this.el.querySelector(".num").value;
	    var details = this.el.querySelector("[name=details]").value;
	    var theme = this.el.querySelector("[name=theme]").value;
	    var phone = this.userInfo.mobile || "",
	        account = this.userInfo.email || "",
	        email = this.userInfo.email || "";
	    var attendee = this.getAttendee();

	    if (!theme) {
	      R.toast('请填写会议主题');
	      return;
	    }
	    if (theme && theme.length > 30) {
	      R.toast('主题字数超过限制');
	      return;
	    }
	    if (!/^[0-9]*[1-9][0-9]*$/.test(number) && number && number != "0") {
	      R.toast('请输入正确的人数');
	      return;
	    }

	    if (+number > +this.routeParam.curentRoom.roommum) {
	      R.toast('人数超过限制');
	      return;
	    }

	    var obj = {
	      roomID: this.routeParam.curentRoom.roomID,
	      time: this.routeParam.timeData.time,
	      Stime: this.routeParam.timeData.Stime,
	      Etime: this.routeParam.timeData.Etime,
	      number: number,
	      details: details,
	      phone: phone,
	      account: account,
	      email: email,
	      attendee: attendee,
	      total: this.totalPrice,
	      theme: theme
	    };
	    var options = {
	      service: "applyRoom",
	      data: obj,
	      success: function (res) {
	        console.log(res);
	        R.loading(-1);

	        this.el.querySelector(".num").value = "";
	        this.el.querySelector("[name=details]").value = "";
	        this.el.querySelector("[name=theme]").value = "";

	        R.toast(res, 1600, function () {
	          this.appPush(theme, details);
	        }.bind(this));
	      }.bind(this),
	      error: function (res) {
	        console.log(res);
	        R.loading(-1);
	        if (res.error && /被预定/.test(res.error.errormsg)) {
	          R.toast(res.error.errormsg);
	        } else {
	          R.toast('预约失败');
	        }
	      }.bind(this)
	    };
	    console.log(options);
	    R.loading();
	    application.sendAjax(options);
	  },
	  getTo: function getTo() {
	    return _underscore2.default.map(this.contactsList, function (each) {
	      return each.member_id;
	    });
	  },
	  appPush: function appPush(theme, details) {
	    var to = this.getTo();
	    details = this.userInfo.name + "邀请你于" + this.routeParam.timeData.time + " " + this.routeParam.timeData.Stime + "参加" + theme + "会议, 地点" + this.routeParam.curentRoom.room + ", 记得准时参加喔";

	    $.ajax({
	      url: "/meeting/sengMsg",
	      type: "POST",
	      data: {
	        to: to,
	        title: "会议通知",
	        desc: details,
	        detailUrl: ""
	      },
	      timeout: 6000,
	      success: function (res) {
	        console.log(res);
	        if (res.code == 0) {
	          R.toast('已成功通知参会人员', function () {
	            this.navigate("NewIndex");
	          }.bind(this));
	        } else {
	          this.navigate("NewIndex");
	        }
	      }.bind(this),
	      error: function (res) {
	        console.log(res);
	        this.navigate("NewIndex");
	      }.bind(this)

	    });
	  }

	});

	exports.default = Detail;

/***/ },
/* 126 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	Object.defineProperty(exports, "__esModule", {
	  value: true
	});

	var _ModuleView = __webpack_require__(127);

	var _ModuleView2 = _interopRequireDefault(_ModuleView);

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	var PageView = _ModuleView2.default.extend({
	  type: "PageView",

	  className: "PageView mui-scroll-wrapper",

	  // 同时解析传递过来的参数供其他部分使用
	  route: function route(options) {

	    // call post route callback
	    this.postRoute(options);
	  },
	  // 路由完成之后执行的方法，在这里参数已经获取成功，可以在这里获取参数执行初始化填充动作
	  postRoute: function postRoute(options) {},
	  setRouteParam: function setRouteParam(options, path) {
	    this.params = {};
	    _underscore2.default.extend(this.params, options);
	    path && this.navigate(path);
	  },
	  getRouteParam: function getRouteParam() {
	    return this.params || null;
	  },
	  clearRouteParam: function clearRouteParam() {
	    this.params = null;
	  },
	  //page enter dom
	  onResume: function onResume() {},
	  navigate: function navigate(path) {
	    window.location.href = "#" + path;
	  }

	});

	exports.default = PageView;

/***/ },
/* 127 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	Object.defineProperty(exports, "__esModule", {
	  value: true
	});

	var _BaseView = __webpack_require__(128);

	var _BaseView2 = _interopRequireDefault(_BaseView);

	var _loader = __webpack_require__(113);

	var _loader2 = _interopRequireDefault(_loader);

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	var ModuleView = _BaseView2.default.extend({
	  type: "ModuleView",

	  willRender: function willRender() {

	    this.views = _underscore2.default.chain(this.options.views || []).sortBy('index').map(function (each) {
	      return this.createView(each);
	    }.bind(this)).compact().value();
	  },

	  createView: function createView(each) {
	    if (each.type == 'html') {
	      //the html should wrap outermost element
	      each.el = $(_loader2.default.getTemplate(each.template))[0];
	      return each;
	    } else {
	      var View = _loader2.default.getPage(each.type).default;
	      // 加载不存在的文件直接报错
	      //if (!View) throw new Error('View ' + each.type + ' Not Exists.');
	      var view = new View(each);
	      // view.el.setAttribute('data-type', each.type);
	      return view;
	    }
	  },
	  // set
	  render: function render() {
	    this.views.reduce(function (el, view) {
	      el.appendChild(view.el);
	      return el;
	    }, this.el);
	    return this;
	  }

	});

	exports.default = ModuleView;

/***/ },
/* 128 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";

	Object.defineProperty(exports, "__esModule", {
	  value: true
	});

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	var BaseView = R.View.extend({
	  type: "BaseView",

	  /*
	   * override constructor to remember 'options'
	   */
	  constructor: function constructor(options) {
	    //remember options
	    this.options = _underscore2.default.defaults(options, this.defaults) || {};
	    R.View.apply(this, [this.options]);
	    // default initElement after initialize
	    this.initElement();
	  },

	  /*
	   *  any render must do setOptions
	   */
	  setOptions: function setOptions() {

	    this.setRender();
	  },
	  /*
	   * override must call super for the right order
	   */
	  initElement: function initElement() {
	    //the configureElement is synchronous for the order
	    this.configureElement();
	    this.setRender();
	  },
	  //synchronous for the order
	  setRender: function setRender() {
	    this.willRender();
	    this.render();
	    this.didRender();
	  },
	  //Normal should call only once
	  configureElement: function configureElement() {},

	  //override for deciding how to do render
	  willRender: function willRender() {},
	  //render can get the final dom
	  render: function render() {},

	  didRender: function didRender() {},

	  willUnmount: function willUnmount() {},

	  // override for the didMount  lifycycle support
	  removeElement: function removeElement() {
	    this.willUnmount();
	    R.View.prototype.removeElement.apply(this, arguments);
	  }

	});

	exports.default = BaseView;

/***/ },
/* 129 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";

	Object.defineProperty(exports, "__esModule", {
	  value: true
	});

	var _PageView = __webpack_require__(126);

	var _PageView2 = _interopRequireDefault(_PageView);

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	var List = _PageView2.default.extend({
	  area: "List",

	  initialize: function initialize() {

	    this.$el.on("click", ".list-ul", this.takeRoom.bind(this));
	  },
	  didRender: function didRender() {
	    this.listUl = this.el.querySelector(".list-ul");
	    this.noSearchEl = this.el.querySelector(".nosearch-img-w");
	    //render
	  },
	  onResume: function onResume() {
	    window.yyesn.client.setHeader({ title: "会议室查询", navColor: "#FD746E" });
	    //初始化单页的区域滚动
	    R('.mui-scroll-wrapper').scroll({
	      indicators: false,
	      deceleration: 0.0001
	    });
	  },
	  postRoute: function postRoute(options) {
	    console.log(options);
	    if (options) {
	      this.ulArray = options.list || [];
	      this.timeData = options.timeData;
	      this.renderListEl(options);
	    }
	  },
	  renderListEl: function renderListEl(options) {
	    if (options.list.length > 0) {
	      var elHtml = [];
	      for (var i = 0; i < options.list.length; i++) {
	        var each = options.list[i];
	        elHtml.push("\n          <li data-id=" + each.roomID + ">\n            <div>\n              <span class=\"list-title\">" + each.room + "</span>\n              <span  class=\"list-money\"><span>￥" + each.cost.substring(0, each.cost.indexOf(".")) + "</span><span class=\"list-time\">/h</span></span>\n            </div>\n            <div class=\"list-capacity\">\n              " + each.roommum + "人 " + each.floor + "\n            </div>\n          </li>\n          ");
	      }
	      this.listUl.innerHTML = elHtml.join("");
	      this.noSearchEl.classList.remove("active");
	    } else {
	      this.listUl.innerHTML = "";
	      this.noSearchEl.classList.add("active");
	    }
	  },
	  takeRoom: function takeRoom(e) {
	    var target = e.target;
	    for (; target && target !== this.listUl; target = target.parentNode) {
	      if (target.tagName == 'LI') {
	        var id = target.getAttribute("data-id");
	        var curentRoom = _underscore2.default.find(this.ulArray, function (each) {
	          return each.roomID == id;
	        });
	        curentRoom && this.setRouteParam({ curentRoom: curentRoom, timeData: this.timeData }, "Detail");
	      }
	    }
	  }

	});

	exports.default = List;

/***/ },
/* 130 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	Object.defineProperty(exports, "__esModule", {
	  value: true
	});

	var _slicedToArray2 = __webpack_require__(131);

	var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);

	var _PageView = __webpack_require__(126);

	var _PageView2 = _interopRequireDefault(_PageView);

	var _hour = __webpack_require__(138);

	var _hour2 = _interopRequireDefault(_hour);

	var _minuteInt = __webpack_require__(139);

	var _minuteInt2 = _interopRequireDefault(_minuteInt);

	var _meetingDay = __webpack_require__(140);

	var _meetingDay2 = _interopRequireDefault(_meetingDay);

	var _todayHour = __webpack_require__(141);

	var _todayHour2 = _interopRequireDefault(_todayHour);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	// import Selector from '../component/selector/selector.js'

	var NewIndex = _PageView2.default.extend({
	  type: "NewIndex",

	  initialize: function initialize() {
	    window.yyesn.client.setHeader({ title: "会议室查询", navColor: "#FD746E" });

	    this.$el.on("click", ".m-date", this.takeDay.bind(this));
	    this.$el.on("click", ".start-time", this.takeStartTime.bind(this));
	    this.$el.on("click", ".end-time", this.takeEndTime.bind(this));
	    this.$el.on("click", ".address", this.takeAddress.bind(this));

	    this.$el.on("click", ".search-btn-block", this.search.bind(this));

	    this.mDayTpl = _meetingDay2.default;
	    this.hourTpl = _hour2.default;
	    this.minuteTpl = _minuteInt2.default;

	    this.todayTpl = _todayHour2.default;

	    // this.dayPicker = new Selector([{width: "100%"}]);
	    // this.timePicker = new Selector([{width: "50%"}, {width: "50%"}]);
	    // this.addressPicker = new Selector([{width: "100%"}]);

	    this.newDayPicker = new R.DtPicker([{ width: "100%" }]);
	    this.newTimePicker = new R.DtPicker([{ width: "50%" }, { width: "50%" }]);
	    this.newAddressPicker = new R.DtPicker([{ width: "100%" }]);

	    this.startTimeValue = "";
	    this.endTimeValue = "";
	    this.addressValue = "";
	    this.dayValue = "";
	  },
	  didRender: function didRender() {

	    this.dayEl = this.el.querySelector(".m-date .value-txt");
	    this.startTimeEl = this.el.querySelector(".start-time .value-txt");
	    this.endTimeEl = this.el.querySelector(".end-time .value-txt");
	    this.addressEl = this.el.querySelector(".address .value-txt");

	    this.loadingEl = this.el.querySelector(".loading-wrapper");

	    //render
	    this.renderDayEl();
	    this.renderAreaUl();

	    this.getUserInfo();

	    //datetime
	    // mui('.mui-picker').picker();
	  },
	  getDay: function getDay(i) {
	    i = i || 0;
	    var myDate = new Date();
	    var hour = myDate.getHours();
	    hour > 18 && i++;
	    myDate.setDate(myDate.getDate() + i);
	    var year = myDate.getFullYear();
	    var mon = myDate.getMonth() + 1;
	    var day = myDate.getDate();
	    var xq = myDate.getDay();
	    if (mon < 10) {
	      mon = "0" + mon;
	    }
	    if (day < 10) {
	      day = "0" + day;
	    }
	    switch (xq) {
	      case 0:
	        xq = "周日";
	        break;
	      case 1:
	        xq = "周一";
	        break;
	      case 2:
	        xq = "周二";
	        break;
	      case 3:
	        xq = "周三";
	        break;
	      case 4:
	        xq = "周四";
	        break;
	      case 5:
	        xq = "周五";
	        break;
	      case 6:
	        xq = "周六";
	        break;
	      default:
	    }
	    return year + "-" + mon + "-" + day;
	  },
	  getHourAndMin: function getHourAndMin() {
	    var myDate = new Date();
	    var hour = myDate.getHours();

	    if (hour > 18 || hour >= 0 && hour < 8) {
	      hour = "08";
	      min = "00";
	    } else {
	      // myDate.setHours(myDate.getHours() + 0);
	      // var hour = myDate.getHours();
	      var min = myDate.getMinutes();
	      if (min < 30) {
	        min = "30";
	        hour = hour < 10 ? "0" + hour : hour;
	      } else {
	        myDate.setHours(hour + 1);
	        hour = myDate.getHours();
	        hour = hour < 10 ? "0" + hour : hour;
	        min = "00";
	      }
	    }

	    return hour + ":" + min;
	  },
	  getHourAndMinEnd: function getHourAndMinEnd() {

	    var stime = (this.dayValue + " " + this.startTimeValue).replace(/-/g, "/");
	    var endtime = Date.parse(stime) + 60 * 60 * 1000;
	    var deadtime = Date.parse((this.dayValue + " " + "19:00").replace(/-/g, "/"));
	    endtime - deadtime > 0 && (endtime = deadtime);

	    endtime = new Date(endtime);
	    var hour = endtime.getHours(),
	        min = endtime.getMinutes();
	    hour = hour < 10 ? "0" + hour : hour;
	    min = min < 10 ? "0" + min : min;

	    return hour + ":" + min;
	  },
	  renderDayEl: function renderDayEl() {
	    this.dayEl.innerText = this.getDay();
	    this.dayValue = this.dayEl.innerText;
	    //开始日期
	    this.startDay = this.dayValue;

	    this.startTimeEl.innerText = this.getHourAndMin();
	    this.startTimeValue = this.startTimeEl.innerText;

	    this.endTimeEl.innerText = this.getHourAndMinEnd();
	    this.endTimeValue = this.endTimeEl.innerText;
	  },
	  takeDay: function takeDay() {
	    var _this = this;

	    var self = this;
	    self.newDayPicker.onsure(function (a) {
	      _this.dayEl.innerText = a.value;
	      _this.dayValue = _this.dayEl.innerText;
	      // if (this.dayValue != this.startDay) {
	      //   this.startTimeEl.innerText = "08:00";
	      //   this.startTimeValue = "08:00"
	      // } else {
	      //   this.startTimeEl.innerText = this.getHourAndMin();
	      //   this.startTimeValue = this.startTimeEl.innerText;
	      // }
	    }).beforeShow(function (y, m, d) {
	      //设置选项
	      this.setOpt(y, self.mDayTpl({})).setByVal(y, self.dayValue);
	    }).onchange(function (changedUl, changedLi, _ref) {
	      var _ref2 = (0, _slicedToArray3.default)(_ref, 3);

	      var y = _ref2[0];
	      var m = _ref2[1];
	      var d = _ref2[2];
	    }).show();
	  },
	  takeStartTime: function takeStartTime() {
	    var _this2 = this;

	    var self = this;
	    self.newTimePicker.onsure(function (y, m) {
	      var h = y.value,
	          m = m.value;
	      h == 19 && m == 30 && (m = "00");
	      self.startTimeEl.innerText = h + ":" + m;
	      self.startTimeValue = _this2.startTimeEl.innerText;
	    }).beforeShow(function (y, m, d) {
	      var curH = void 0,
	          curM = void 0;
	      if (self.startTimeEl.innerText.indexOf(":") > -1) {
	        curH = self.startTimeEl.innerText.split(":")[0];
	        curM = self.startTimeEl.innerText.split(":")[1];
	      }
	      var hourTpl = self.hourTpl;
	      if (self.dayValue == self.startDay) {
	        hourTpl = self.todayTpl;
	      }

	      //设置选项
	      this.setOpt(y, hourTpl({ fromDate: new Date(), selectedDate: "" })).setOpt(m, self.minuteTpl({ fromDate: new Date(), selectedDate: "" })).setByVal(y, curH || new Date().getHours()).setByVal(m, curM || new Date().getMinutes());
	    }).onchange(function (changedUl, changedLi, _ref3) {
	      var _ref4 = (0, _slicedToArray3.default)(_ref3, 3);

	      var y = _ref4[0];
	      var m = _ref4[1];
	      var d = _ref4[2];
	    }).show();
	  },
	  takeEndTime: function takeEndTime() {
	    var _this3 = this;

	    var self = this;
	    self.newTimePicker.onsure(function (y, m) {
	      var h = y.value,
	          m = m.value;
	      h == 19 && m == 30 && (m = "00");
	      self.endTimeEl.innerText = h + ":" + m;
	      self.endTimeValue = _this3.endTimeEl.innerText;
	    }).beforeShow(function (y, m, d) {
	      var curH = void 0,
	          curM = void 0;
	      if (self.endTimeEl.innerText.indexOf(":") > -1) {
	        curH = self.endTimeEl.innerText.split(":")[0];
	        curM = self.endTimeEl.innerText.split(":")[1];
	      }

	      var hourTpl = self.hourTpl;
	      if (self.dayValue == self.startDay) {
	        hourTpl = self.todayTpl;
	      }

	      //设置选项
	      this.setOpt(y, hourTpl({ fromDate: new Date(), selectedDate: "" })).setOpt(m, self.minuteTpl({ fromDate: new Date(), selectedDate: "" })).setByVal(y, curH || new Date().getHours()).setByVal(m, curM || new Date().getMinutes());
	    }).onchange(function (changedUl, changedLi, _ref5) {
	      var _ref6 = (0, _slicedToArray3.default)(_ref5, 3);

	      var y = _ref6[0];
	      var m = _ref6[1];
	      var d = _ref6[2];
	    }).show();
	  },
	  takeAddress: function takeAddress() {
	    var self = this;
	    self.newAddressPicker.onsure(function (a) {
	      self.addressEl.innerText = a.text;
	      self.addressValue = a.value;
	    }).beforeShow(function (y, m, d) {
	      //设置选项
	      this.setOpt(y, self.areaLiHtml || "").setByVal(y, self.addressValue);
	    }).onchange(function (changedUl, changedLi, _ref7) {
	      var _ref8 = (0, _slicedToArray3.default)(_ref7, 3);

	      var y = _ref8[0];
	      var m = _ref8[1];
	      var d = _ref8[2];
	    }).show();
	  },
	  renderAreaUl: function renderAreaUl() {
	    var options = {
	      service: "GetAllrooms",
	      data: {},
	      success: function (res) {
	        console.log(res);
	        var areaList = res.districtlist;
	        var elHtml = [];
	        elHtml.push("<li  data-choose=全部 data-value=''>全部</li>");
	        for (var i = 0; i < areaList.length; i++) {
	          var each = areaList[i];
	          elHtml.push("<li  data-choose=" + each.district + " data-value=" + each.districtID + ">" + each.district + "</li>");
	        }
	        this.areaLiHtml = elHtml.join("");
	      }.bind(this),
	      error: function error(err) {
	        console.log(err);
	      }
	    };
	    application.sendAjax(options);
	  },
	  fomatTime: function fomatTime(s) {
	    s = s || "";
	    return s.replace(/:/, "-");
	  },
	  isTimeRight: function isTimeRight() {
	    var stime = (this.dayValue + " " + this.startTimeValue).replace(/-/g, "/");
	    var endtime = (this.dayValue + " " + this.endTimeValue).replace(/-/g, "/");
	    return Date.parse(endtime) - Date.parse(stime) <= 0 ? false : true;
	  },
	  search: function search() {

	    if (!this.startTimeValue) {
	      R.toast('请选择开始时间');
	      return;
	    }
	    if (!this.endTimeValue) {
	      R.toast('请选择结束时间');
	      return;
	    }

	    if (!this.isTimeRight()) {
	      R.toast('结束时间应大于开始时间');
	      return;
	    }

	    var options = {
	      service: "SearchMetting",
	      data: { time: this.dayValue, Stime: this.startTimeValue, Etime: this.endTimeValue, districtID: this.addressValue },
	      success: function (res) {
	        R.loading(-1);
	        this.setRouteParam({ list: res.list, timeData: { time: this.dayValue, Stime: this.startTimeValue, Etime: this.endTimeValue } }, "List");
	      }.bind(this),
	      error: function (res) {
	        R.loading(-1);
	        res.error && R.toast(res.error.errormsg);
	      }.bind(this)
	    };
	    console.log(options);
	    R.loading();
	    application.sendAjax(options);
	  },
	  onResume: function onResume() {
	    window.yyesn.client.setHeader({ title: "会议室查询", navColor: "#FD746E" });
	    //初始化单页的区域滚动
	    R('.mui-scroll-wrapper').scroll({
	      indicators: false,
	      deceleration: 0.0001
	    });
	  },
	  getUserInfo: function getUserInfo() {
	    $.ajax({
	      url: "/getUser",
	      type: "GET",
	      timeout: 15000,
	      success: function (res) {
	        if (res.code == 0) {
	          window._userInfo = res.result;
	        }
	      }.bind(this),
	      error: function (res) {}.bind(this)

	    });
	  }

	});

	exports.default = NewIndex;

/***/ },
/* 131 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";

	exports.__esModule = true;

	var _isIterable2 = __webpack_require__(132);

	var _isIterable3 = _interopRequireDefault(_isIterable2);

	var _getIterator2 = __webpack_require__(135);

	var _getIterator3 = _interopRequireDefault(_getIterator2);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function () {
	  function sliceIterator(arr, i) {
	    var _arr = [];
	    var _n = true;
	    var _d = false;
	    var _e = undefined;

	    try {
	      for (var _i = (0, _getIterator3.default)(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
	        _arr.push(_s.value);

	        if (i && _arr.length === i) break;
	      }
	    } catch (err) {
	      _d = true;
	      _e = err;
	    } finally {
	      try {
	        if (!_n && _i["return"]) _i["return"]();
	      } finally {
	        if (_d) throw _e;
	      }
	    }

	    return _arr;
	  }

	  return function (arr, i) {
	    if (Array.isArray(arr)) {
	      return arr;
	    } else if ((0, _isIterable3.default)(Object(arr))) {
	      return sliceIterator(arr, i);
	    } else {
	      throw new TypeError("Invalid attempt to destructure non-iterable instance");
	    }
	  };
	}();

/***/ },
/* 132 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(133), __esModule: true };

/***/ },
/* 133 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(54);
	__webpack_require__(25);
	module.exports = __webpack_require__(134);

/***/ },
/* 134 */
/***/ function(module, exports, __webpack_require__) {

	var classof   = __webpack_require__(91)
	  , ITERATOR  = __webpack_require__(51)('iterator')
	  , Iterators = __webpack_require__(33);
	module.exports = __webpack_require__(3).isIterable = function(it){
	  var O = Object(it);
	  return O[ITERATOR] !== undefined
	    || '@@iterator' in O
	    || Iterators.hasOwnProperty(classof(O));
	};

/***/ },
/* 135 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(136), __esModule: true };

/***/ },
/* 136 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(54);
	__webpack_require__(25);
	module.exports = __webpack_require__(137);

/***/ },
/* 137 */
/***/ function(module, exports, __webpack_require__) {

	var anObject = __webpack_require__(14)
	  , get      = __webpack_require__(96);
	module.exports = __webpack_require__(3).getIterator = function(it){
	  var iterFn = get(it);
	  if(typeof iterFn != 'function')throw TypeError(it + ' is not iterable!');
	  return anObject(iterFn.call(it));
	};

/***/ },
/* 138 */
/***/ function(module, exports) {

	module.exports = function (obj) {
	obj || (obj = {});
	var __t, __p = '', __j = Array.prototype.join;
	function print() { __p += __j.call(arguments, '') }
	with (obj) {


		var h = fromDate.getHours();

		if(selectedDate) {
			h = selectedDate.getHours();
		}

		for(var i = 8; i <= 19; i++) {
			i = i < 10 ? "0" +i : i;
			h = h < 10 ? "0" + h : h;
	;
	__p += '\n	<li data-value="' +
	((__t = (i)) == null ? '' : __t) +
	'" data-choose="' +
	((__t = (i)) == null ? '' : __t) +
	'时" ' +
	((__t = (h===i ? 'default' : '')) == null ? '' : __t) +
	'>' +
	((__t = (i)) == null ? '' : __t) +
	'</li>\n';
	};
	__p += '\n';

	}
	return __p
	}

/***/ },
/* 139 */
/***/ function(module, exports) {

	module.exports = function (obj) {
	obj || (obj = {});
	var __t, __p = '', __j = Array.prototype.join;
	function print() { __p += __j.call(arguments, '') }
	with (obj) {



	  var int =["00", "30"]

		for(var i = 0; i < int.length; i++) {
			var each = int[i];
	;
	__p += '\n	<li data-value="' +
	((__t = (each)) == null ? '' : __t) +
	'" data-choose="' +
	((__t = (each)) == null ? '' : __t) +
	'分">' +
	((__t = (each)) == null ? '' : __t) +
	'</li>\n';
	};
	__p += '\n';

	}
	return __p
	}

/***/ },
/* 140 */
/***/ function(module, exports) {

	module.exports = function (obj) {
	obj || (obj = {});
	var __t, __p = '', __j = Array.prototype.join;
	function print() { __p += __j.call(arguments, '') }
	with (obj) {


	 function getDay (i) {
	  i = i || 0;
	  var myDate = new Date();
	  var hour = myDate.getHours();
	  hour > 18 && i++
	  myDate.setDate(myDate.getDate() + i);
	  var year = myDate.getFullYear();
	  var mon = myDate.getMonth() + 1;
	  var day = myDate.getDate();
	  var xq = myDate.getDay();
	  if (mon < 10) {
	    mon = "0" + mon
	  }
	  if (day < 10) {
	    day = "0" + day
	  }
	  switch (xq) {
	    case 0:
	      xq = "周日"
	      break;
	    case 1:
	      xq = "周一"
	      break;
	    case 2:
	      xq = "周二"
	      break;
	    case 3:
	      xq = "周三"
	      break;
	    case 4:
	      xq = "周四"
	      break;
	    case 5:
	      xq = "周五"
	      break;
	    case 6:
	      xq = "周六"
	      break;
	    default:
	  }
	  return {value: year + "-" + mon + "-" + day + " " + xq, date: year + "-" + mon + "-" + day }
	}
		for(var i = 0; i <10; i++) {
	   var each = getDay(i);
	;
	__p += '\n	<li data-value="' +
	((__t = (each.date)) == null ? '' : __t) +
	'" data-choose="' +
	((__t = (each.date)) == null ? '' : __t) +
	'" >' +
	((__t = (each.date)) == null ? '' : __t) +
	'</li>\n';
	};
	__p += '\n';

	}
	return __p
	}

/***/ },
/* 141 */
/***/ function(module, exports) {

	module.exports = function (obj) {
	obj || (obj = {});
	var __t, __p = '', __j = Array.prototype.join;
	function print() { __p += __j.call(arguments, '') }
	with (obj) {




	  var myDate = new Date();
	  var h = myDate.getHours();
	  if (h > 18 || (h >= 0 && h < 8)) {
	    h = 8;
	  }

		for(var i = h; i <= 19; i++) {
			i = i < 10 ? "0" +i : i;
			h = h < 10 ? "0" + h : h;
	;
	__p += '\n	<li data-value="' +
	((__t = (i)) == null ? '' : __t) +
	'" data-choose="' +
	((__t = (i)) == null ? '' : __t) +
	'时" ' +
	((__t = (h===i ? 'default' : '')) == null ? '' : __t) +
	'>' +
	((__t = (i)) == null ? '' : __t) +
	'</li>\n';
	};
	__p += '\n';

	}
	return __p
	}

/***/ },
/* 142 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	Object.defineProperty(exports, "__esModule", {
	  value: true
	});

	var _BaseView = __webpack_require__(128);

	var _BaseView2 = _interopRequireDefault(_BaseView);

	var _loader = __webpack_require__(113);

	var _loader2 = _interopRequireDefault(_loader);

	var _underscore = __webpack_require__(75);

	var _underscore2 = _interopRequireDefault(_underscore);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	var NavigationView = _BaseView2.default.extend({
	  type: "NavigationView",

	  initialize: function initialize() {
	    _BaseView2.default.prototype.initialize.apply(this, arguments);
	    // stack to only store the path order {path: 'page1', params:{}}
	    this.stack = [];
	    //cache all page
	    this.pageMap = {};
	    window.addEventListener('hashchange', this.route.bind(this), false);
	    window.addEventListener('load', this.route.bind(this), false);
	    //TODO 从配置读取
	    window.location.href = '#NewIndex';
	  },

	  route: function route() {
	    console.log(location.hash);
	    var path = location.hash.slice(1);
	    if (this.curent_path == "NewIndex" && path == "Detail" && window.yyesn._initialized) {
	      //关闭webview
	      window.yyesn.client.closePage();
	      return;
	    }
	    if (this.curent_path == path) return;
	    this.curent_path = path;

	    // 当前页面，栈顶
	    var id = this.stack.length > 0 && this.stack[this.stack.length - 1].path;
	    var currentPage = id && this.pageMap[id];

	    var isBack = this.stack.length > 1 && this.stack[this.stack.length - 2].path == path;

	    if (!currentPage) {
	      var View = _loader2.default.getPage(path).default;
	      this.pageMap[path] = new View({ views: [{ type: "html", template: path + ".html" }] });
	      console.log(this.pageMap[path]);
	      var page = this.pageMap[path].$el;
	      document.body.appendChild(this.pageMap[path].el);
	      this.pageMap[path].onResume();
	      this.stack.push({ path: path, params: {} });
	    } else {
	      if (isBack) {
	        //回退页
	        var nextPage = this.pageMap[path];

	        document.body.insertBefore(nextPage.el, currentPage.el);
	        var tabbar = nextPage.$el.find(".mui-bar-tab")[0];

	        setTimeout(function () {
	          //不启动动画

	          if (nextPage.$el.find(".mui-bar-tab")[0] && currentPage.$el.find(".mui-bar-tab")[0]) {
	            currentPage.removeElement();
	          } else {
	            //有些浏览器有fixed问题 把动画启用就可以 magic
	            // nextPage.animateSlideInLeft(function () {
	            //
	            // })
	            //为了避免后退箭头等造成颜色闪烁
	            var header = currentPage.$el.find('header')[0];
	            if (header) {
	              var leftIcon = header.querySelector(".header-left-icon");
	              if (leftIcon) leftIcon.style.visibility = 'hidden';
	            }

	            currentPage.animateSlideOutRight(function () {
	              currentPage.removeElement();
	              if (leftIcon) leftIcon.style.visibility = 'visible';
	            });
	          }
	          var param = currentPage.getRouteParam();
	          currentPage.clearRouteParam();
	          nextPage.route && nextPage.route(param);
	          nextPage.onResume();
	          this.stack.pop();
	        }.bind(this), 10);
	      } else {
	        if (!this.pageMap[path]) {
	          var View = _loader2.default.getPage(path).default;
	          this.pageMap[path] = new View({ views: [{ type: "html", template: path + ".html" }] });
	        }

	        var nextPage = this.pageMap[path];
	        // document.body.appendChild(nextPage.el);
	        document.body.insertBefore(nextPage.el, currentPage.el);

	        //移动浏览器上 做延时处理避免动画失效
	        setTimeout(function () {
	          if (nextPage.$el.find(".mui-bar-tab")[0] && currentPage.$el.find(".mui-bar-tab")[0]) {
	            currentPage.removeElement();
	          } else {
	            nextPage.animateSlideInRight(function () {
	              // console.log(2);
	            });
	            currentPage.animateSlideOutLeft(function () {
	              currentPage.removeElement();
	            });
	          }
	          var param = currentPage.getRouteParam();
	          currentPage.clearRouteParam();
	          nextPage.route && nextPage.route(param);
	          nextPage.onResume();
	          this.stack.push({ path: path, params: {} });
	        }.bind(this), 10);
	      }
	    }
	  }

	});

	var a = new NavigationView();
	// a.route("Page1");


	exports.default = NavigationView;

/***/ },
/* 143 */
/***/ function(module, exports) {

	'use strict';

	(function ($, window, document, undefined) {
		var CLASS_SCROLLBAR = 'mui-scrollbar';
		var CLASS_INDICATOR = 'mui-scrollbar-indicator';
		var CLASS_SCROLLBAR_VERTICAL = CLASS_SCROLLBAR + '-vertical';
		var CLASS_SCROLLBAR_HORIZONTAL = CLASS_SCROLLBAR + '-horizontal';

		var CLASS_ACTIVE = 'mui-active';

		var ease = {
			quadratic: {
				style: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)',
				fn: function fn(k) {
					return k * (2 - k);
				}
			},
			circular: {
				style: 'cubic-bezier(0.1, 0.57, 0.1, 1)',
				fn: function fn(k) {
					return Math.sqrt(1 - --k * k);
				}
			},
			outCirc: {
				style: 'cubic-bezier(0.075, 0.82, 0.165, 1)'
			},
			outCubic: {
				style: 'cubic-bezier(0.165, 0.84, 0.44, 1)'
			}
		};
		var Scroll = $.Class.extend({
			init: function init(element, options) {
				this.wrapper = this.element = element;
				this.scroller = this.wrapper.children[0];
				this.scrollerStyle = this.scroller && this.scroller.style;
				this.stopped = false;

				this.options = $.extend(true, {
					scrollY: true, //是否竖向滚动
					scrollX: false, //是否横向滚动
					startX: 0, //初始化时滚动至x
					startY: 0, //初始化时滚动至y

					indicators: true, //是否显示滚动条
					stopPropagation: false,
					hardwareAccelerated: true,
					fixedBadAndorid: false,
					preventDefaultException: {
						tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT|VIDEO)$/
					},
					momentum: true,

					snapX: 0.5, //横向切换距离(以当前容器宽度为基准)
					snap: false, //图片轮播，拖拽式选项卡

					bounce: true, //是否启用回弹
					bounceTime: 500, //回弹动画时间
					bounceEasing: ease.outCirc, //回弹动画曲线

					scrollTime: 500,
					scrollEasing: ease.outCubic, //轮播动画曲线


					directionLockThreshold: 5,

					parallaxElement: false, //视差元素
					parallaxRatio: 0.5
				}, options);

				this.x = 0;
				this.y = 0;
				this.translateZ = this.options.hardwareAccelerated ? ' translateZ(0)' : '';

				this._init();
				if (this.scroller) {
					this.refresh();
					//				if (this.options.startX !== 0 || this.options.startY !== 0) { //需要判断吗？后续根据实际情况再看看
					this.scrollTo(this.options.startX, this.options.startY);
					//				}
				}
			},
			_init: function _init() {
				this._initParallax();
				this._initIndicators();
				this._initEvent();
			},
			_initParallax: function _initParallax() {
				if (this.options.parallaxElement) {
					this.parallaxElement = document.querySelector(this.options.parallaxElement);
					this.parallaxStyle = this.parallaxElement.style;
					this.parallaxHeight = this.parallaxElement.offsetHeight;
					this.parallaxImgStyle = this.parallaxElement.querySelector('img').style;
				}
			},
			_initIndicators: function _initIndicators() {
				var self = this;
				self.indicators = [];
				if (!this.options.indicators) {
					return;
				}
				var indicators = [],
				    indicator;

				// Vertical scrollbar
				if (self.options.scrollY) {
					indicator = {
						el: this._createScrollBar(CLASS_SCROLLBAR_VERTICAL),
						listenX: false
					};

					this.wrapper.appendChild(indicator.el);
					indicators.push(indicator);
				}

				// Horizontal scrollbar
				if (this.options.scrollX) {
					indicator = {
						el: this._createScrollBar(CLASS_SCROLLBAR_HORIZONTAL),
						listenY: false
					};

					this.wrapper.appendChild(indicator.el);
					indicators.push(indicator);
				}

				for (var i = indicators.length; i--;) {
					this.indicators.push(new Indicator(this, indicators[i]));
				}
			},
			_initSnap: function _initSnap() {
				this.currentPage = {};
				this.pages = [];
				var snaps = this.snaps;
				var length = snaps.length;
				var m = 0;
				var n = -1;
				var x = 0;
				var leftX = 0;
				var rightX = 0;
				var snapX = 0;
				for (var i = 0; i < length; i++) {
					var snap = snaps[i];
					var offsetLeft = snap.offsetLeft;
					var offsetWidth = snap.offsetWidth;
					if (i === 0 || offsetLeft <= snaps[i - 1].offsetLeft) {
						m = 0;
						n++;
					}
					if (!this.pages[m]) {
						this.pages[m] = [];
					}
					x = this._getSnapX(offsetLeft);
					snapX = Math.round(offsetWidth * this.options.snapX);
					leftX = x - snapX;
					rightX = x - offsetWidth + snapX;
					this.pages[m][n] = {
						x: x,
						leftX: leftX,
						rightX: rightX,
						pageX: m,
						element: snap
					};
					if (snap.classList.contains(CLASS_ACTIVE)) {
						this.currentPage = this.pages[m][0];
					}
					if (x >= this.maxScrollX) {
						m++;
					}
				}
				this.options.startX = this.currentPage.x || 0;
			},
			_getSnapX: function _getSnapX(offsetLeft) {
				return Math.max(Math.min(0, -offsetLeft + this.wrapperWidth / 2), this.maxScrollX);
			},
			_gotoPage: function _gotoPage(index) {
				this.currentPage = this.pages[Math.min(index, this.pages.length - 1)][0];
				for (var i = 0, len = this.snaps.length; i < len; i++) {
					if (i === index) {
						this.snaps[i].classList.add(CLASS_ACTIVE);
					} else {
						this.snaps[i].classList.remove(CLASS_ACTIVE);
					}
				}
				this.scrollTo(this.currentPage.x, 0, this.options.scrollTime);
			},
			_nearestSnap: function _nearestSnap(x) {
				if (!this.pages.length) {
					return {
						x: 0,
						pageX: 0
					};
				}
				var i = 0;
				var length = this.pages.length;
				if (x > 0) {
					x = 0;
				} else if (x < this.maxScrollX) {
					x = this.maxScrollX;
				}
				for (; i < length; i++) {
					var nearestX = this.direction === 'left' ? this.pages[i][0].leftX : this.pages[i][0].rightX;
					if (x >= nearestX) {
						return this.pages[i][0];
					}
				}
				return {
					x: 0,
					pageX: 0
				};
			},
			_initEvent: function _initEvent(detach) {
				var action = detach ? 'removeEventListener' : 'addEventListener';
				window[action]('orientationchange', this);
				window[action]('resize', this);

				this.scroller[action]('webkitTransitionEnd', this);

				this.wrapper[action]($.EVENT_START, this);
				this.wrapper[action]($.EVENT_CANCEL, this);
				this.wrapper[action]($.EVENT_END, this);
				this.wrapper[action]('drag', this);
				this.wrapper[action]('dragend', this);
				this.wrapper[action]('flick', this);
				this.wrapper[action]('scrollend', this);
				if (this.options.scrollX) {
					this.wrapper[action]('swiperight', this);
				}
				var segmentedControl = this.wrapper.querySelector('.mui-segmented-control');
				if (segmentedControl) {
					//靠，这个bug排查了一下午，阻止hash跳转，一旦hash跳转会导致可拖拽选项卡的tab不见
					mui(segmentedControl)[detach ? 'off' : 'on']('click', 'a', $.preventDefault);
				}

				this.wrapper[action]('scrollstart', this);
				this.wrapper[action]('refresh', this);
			},
			_handleIndicatorScrollend: function _handleIndicatorScrollend() {
				this.indicators.map(function (indicator) {
					indicator.fade();
				});
			},
			_handleIndicatorScrollstart: function _handleIndicatorScrollstart() {
				this.indicators.map(function (indicator) {
					indicator.fade(1);
				});
			},
			_handleIndicatorRefresh: function _handleIndicatorRefresh() {
				this.indicators.map(function (indicator) {
					indicator.refresh();
				});
			},
			handleEvent: function handleEvent(e) {
				if (this.stopped) {
					this.resetPosition();
					return;
				}

				switch (e.type) {
					case $.EVENT_START:
						this._start(e);
						break;
					case 'drag':
						this.options.stopPropagation && e.stopPropagation();
						this._drag(e);
						break;
					case 'dragend':
					case 'flick':
						this.options.stopPropagation && e.stopPropagation();
						this._flick(e);
						break;
					case $.EVENT_CANCEL:
					case $.EVENT_END:
						this._end(e);
						break;
					case 'webkitTransitionEnd':
						this.transitionTimer && this.transitionTimer.cancel();
						this._transitionEnd(e);
						break;
					case 'scrollstart':
						this._handleIndicatorScrollstart(e);
						break;
					case 'scrollend':
						this._handleIndicatorScrollend(e);
						this._scrollend(e);
						e.stopPropagation();
						break;
					case 'orientationchange':
					case 'resize':
						this._resize();
						break;
					case 'swiperight':
						e.stopPropagation();
						break;
					case 'refresh':
						this._handleIndicatorRefresh(e);
						break;

				}
			},
			_start: function _start(e) {
				this.moved = this.needReset = false;
				this._transitionTime();
				if (this.isInTransition) {
					this.needReset = true;
					this.isInTransition = false;
					var pos = $.parseTranslateMatrix($.getStyles(this.scroller, 'webkitTransform'));
					this.setTranslate(Math.round(pos.x), Math.round(pos.y));
					//				this.resetPosition(); //reset
					$.trigger(this.scroller, 'scrollend', this);
					//				e.stopPropagation();
					e.preventDefault();
				}
				this.reLayout();
				$.trigger(this.scroller, 'beforescrollstart', this);
			},
			_getDirectionByAngle: function _getDirectionByAngle(angle) {
				if (angle < -80 && angle > -100) {
					return 'up';
				} else if (angle >= 80 && angle < 100) {
					return 'down';
				} else if (angle >= 170 || angle <= -170) {
					return 'left';
				} else if (angle >= -35 && angle <= 10) {
					return 'right';
				}
				return null;
			},
			_drag: function _drag(e) {
				//			if (this.needReset) {
				//				e.stopPropagation(); //disable parent drag(nested scroller)
				//				return;
				//			}
				var detail = e.detail;
				if (this.options.scrollY || detail.direction === 'up' || detail.direction === 'down') {
					//如果是竖向滚动或手势方向是上或下
					//ios8 hack
					if ($.os.ios && parseFloat($.os.version) >= 8) {
						//多webview时，离开当前webview会导致后续touch事件不触发
						var clientY = detail.gesture.touches[0].clientY;
						//下拉刷新 or 上拉加载
						if (clientY + 10 > window.innerHeight || clientY < 10) {
							this.resetPosition(this.options.bounceTime);
							return;
						}
					}
				}
				var isPreventDefault = false,
				    isReturn = false;
				var direction = this._getDirectionByAngle(detail.angle);
				if (detail.direction === 'left' || detail.direction === 'right') {
					if (this.options.scrollX) {
						isPreventDefault = true;
						if (!this.moved) {
							//识别角度(该角度导致轮播不灵敏)
							//						if (direction !== 'left' && direction !== 'right') {
							//							isReturn = true;
							//						} else {
							$.gestures.session.lockDirection = true; //锁定方向
							$.gestures.session.startDirection = detail.direction;
							//						}
						}
					} else if (this.options.scrollY && !this.moved) {
						isReturn = true;
					}
				} else if (detail.direction === 'up' || detail.direction === 'down') {
					if (this.options.scrollY) {
						isPreventDefault = true;
						//					if (!this.moved) { //识别角度,竖向滚动似乎没必要进行小角度验证
						//						if (direction !== 'up' && direction !== 'down') {
						//							isReturn = true;
						//						}
						//					}
						if (!this.moved) {
							$.gestures.session.lockDirection = true; //锁定方向
							$.gestures.session.startDirection = detail.direction;
						}
					} else if (this.options.scrollX && !this.moved) {
						isReturn = true;
					}
				} else {
					isReturn = true;
				}
				if (this.moved || isPreventDefault) {
					e.stopPropagation(); //阻止冒泡(scroll类嵌套)
					detail.gesture && detail.gesture.preventDefault();
				}
				if (isReturn) {
					//禁止非法方向滚动
					return;
				}
				if (!this.moved) {
					$.trigger(this.scroller, 'scrollstart', this);
				} else {
					e.stopPropagation(); //move期间阻止冒泡(scroll嵌套)
				}
				var deltaX = 0;
				var deltaY = 0;
				if (!this.moved) {
					//start
					deltaX = detail.deltaX;
					deltaY = detail.deltaY;
				} else {
					//move
					deltaX = detail.deltaX - $.gestures.session.prevTouch.deltaX;
					deltaY = detail.deltaY - $.gestures.session.prevTouch.deltaY;
				}
				var absDeltaX = Math.abs(detail.deltaX);
				var absDeltaY = Math.abs(detail.deltaY);
				if (absDeltaX > absDeltaY + this.options.directionLockThreshold) {
					deltaY = 0;
				} else if (absDeltaY >= absDeltaX + this.options.directionLockThreshold) {
					deltaX = 0;
				}

				deltaX = this.hasHorizontalScroll ? deltaX : 0;
				deltaY = this.hasVerticalScroll ? deltaY : 0;
				var newX = this.x + deltaX;
				var newY = this.y + deltaY;
				// Slow down if outside of the boundaries
				if (newX > 0 || newX < this.maxScrollX) {
					newX = this.options.bounce ? this.x + deltaX / 3 : newX > 0 ? 0 : this.maxScrollX;
				}
				if (newY > 0 || newY < this.maxScrollY) {
					newY = this.options.bounce ? this.y + deltaY / 3 : newY > 0 ? 0 : this.maxScrollY;
				}

				if (!this.requestAnimationFrame) {
					this._updateTranslate();
				}
				this.direction = detail.deltaX > 0 ? 'right' : 'left';
				this.moved = true;
				this.x = newX;
				this.y = newY;
				$.trigger(this.scroller, 'scroll', this);
			},
			_flick: function _flick(e) {
				//			if (!this.moved || this.needReset) {
				//				return;
				//			}
				if (!this.moved) {
					return;
				}
				e.stopPropagation();
				var detail = e.detail;
				this._clearRequestAnimationFrame();
				if (e.type === 'dragend' && detail.flick) {
					//dragend
					return;
				}

				var newX = Math.round(this.x);
				var newY = Math.round(this.y);

				this.isInTransition = false;
				// reset if we are outside of the boundaries
				if (this.resetPosition(this.options.bounceTime)) {
					return;
				}

				this.scrollTo(newX, newY); // ensures that the last position is rounded

				if (e.type === 'dragend') {
					//dragend
					$.trigger(this.scroller, 'scrollend', this);
					return;
				}
				var time = 0;
				var easing = '';
				// start momentum animation if needed
				if (this.options.momentum && detail.flickTime < 300) {
					var momentumX = this.hasHorizontalScroll ? this._momentum(this.x, detail.flickDistanceX, detail.flickTime, this.maxScrollX, this.options.bounce ? this.wrapperWidth : 0, this.options.deceleration) : {
						destination: newX,
						duration: 0
					};
					var momentumY = this.hasVerticalScroll ? this._momentum(this.y, detail.flickDistanceY, detail.flickTime, this.maxScrollY, this.options.bounce ? this.wrapperHeight : 0, this.options.deceleration) : {
						destination: newY,
						duration: 0
					};
					newX = momentumX.destination;
					newY = momentumY.destination;
					time = Math.max(momentumX.duration, momentumY.duration);
					this.isInTransition = true;
				}

				if (newX != this.x || newY != this.y) {
					if (newX > 0 || newX < this.maxScrollX || newY > 0 || newY < this.maxScrollY) {
						easing = ease.quadratic;
					}
					this.scrollTo(newX, newY, time, easing);
					return;
				}

				$.trigger(this.scroller, 'scrollend', this);
				//			e.stopPropagation();
			},
			_end: function _end(e) {
				this.needReset = false;
				if (!this.moved && this.needReset || e.type === $.EVENT_CANCEL) {
					this.resetPosition();
				}
			},
			_transitionEnd: function _transitionEnd(e) {
				if (e.target != this.scroller || !this.isInTransition) {
					return;
				}
				this._transitionTime();
				if (!this.resetPosition(this.options.bounceTime)) {
					this.isInTransition = false;
					$.trigger(this.scroller, 'scrollend', this);
				}
			},
			_scrollend: function _scrollend(e) {
				if (Math.abs(this.y) > 0 && this.y <= this.maxScrollY) {
					$.trigger(this.scroller, 'scrollbottom', this);
				}
			},
			_resize: function _resize() {
				var that = this;
				clearTimeout(that.resizeTimeout);
				that.resizeTimeout = setTimeout(function () {
					that.refresh();
				}, that.options.resizePolling);
			},
			_transitionTime: function _transitionTime(time) {
				time = time || 0;
				this.scrollerStyle['webkitTransitionDuration'] = time + 'ms';
				if (this.parallaxElement && this.options.scrollY) {
					//目前仅支持竖向视差效果
					this.parallaxStyle['webkitTransitionDuration'] = time + 'ms';
				}
				if (this.options.fixedBadAndorid && !time && $.os.isBadAndroid) {
					this.scrollerStyle['webkitTransitionDuration'] = '0.001s';
					if (this.parallaxElement && this.options.scrollY) {
						//目前仅支持竖向视差效果
						this.parallaxStyle['webkitTransitionDuration'] = '0.001s';
					}
				}
				if (this.indicators) {
					for (var i = this.indicators.length; i--;) {
						this.indicators[i].transitionTime(time);
					}
				}
				if (time) {
					//自定义timer，保证webkitTransitionEnd始终触发
					this.transitionTimer && this.transitionTimer.cancel();
					this.transitionTimer = $.later(function () {
						$.trigger(this.scroller, 'webkitTransitionEnd');
					}, time + 100, this);
				}
			},
			_transitionTimingFunction: function _transitionTimingFunction(easing) {
				this.scrollerStyle['webkitTransitionTimingFunction'] = easing;
				if (this.parallaxElement && this.options.scrollY) {
					//目前仅支持竖向视差效果
					this.parallaxStyle['webkitTransitionDuration'] = easing;
				}
				if (this.indicators) {
					for (var i = this.indicators.length; i--;) {
						this.indicators[i].transitionTimingFunction(easing);
					}
				}
			},
			_translate: function _translate(x, y) {
				this.x = x;
				this.y = y;
			},
			_clearRequestAnimationFrame: function _clearRequestAnimationFrame() {
				if (this.requestAnimationFrame) {
					cancelAnimationFrame(this.requestAnimationFrame);
					this.requestAnimationFrame = null;
				}
			},
			_updateTranslate: function _updateTranslate() {
				var self = this;
				if (self.x !== self.lastX || self.y !== self.lastY) {
					self.setTranslate(self.x, self.y);
				}
				self.requestAnimationFrame = requestAnimationFrame(function () {
					self._updateTranslate();
				});
			},
			_createScrollBar: function _createScrollBar(clazz) {
				var scrollbar = document.createElement('div');
				var indicator = document.createElement('div');
				scrollbar.className = CLASS_SCROLLBAR + ' ' + clazz;
				indicator.className = CLASS_INDICATOR;
				scrollbar.appendChild(indicator);
				if (clazz === CLASS_SCROLLBAR_VERTICAL) {
					this.scrollbarY = scrollbar;
					this.scrollbarIndicatorY = indicator;
				} else if (clazz === CLASS_SCROLLBAR_HORIZONTAL) {
					this.scrollbarX = scrollbar;
					this.scrollbarIndicatorX = indicator;
				}
				this.wrapper.appendChild(scrollbar);
				return scrollbar;
			},
			_preventDefaultException: function _preventDefaultException(el, exceptions) {
				for (var i in exceptions) {
					if (exceptions[i].test(el[i])) {
						return true;
					}
				}
				return false;
			},
			_reLayout: function _reLayout() {
				if (!this.hasHorizontalScroll) {
					this.maxScrollX = 0;
					this.scrollerWidth = this.wrapperWidth;
				}

				if (!this.hasVerticalScroll) {
					this.maxScrollY = 0;
					this.scrollerHeight = this.wrapperHeight;
				}

				this.indicators.map(function (indicator) {
					indicator.refresh();
				});

				//以防slider类嵌套使用
				if (this.options.snap && typeof this.options.snap === 'string') {
					var items = this.scroller.querySelectorAll(this.options.snap);
					this.itemLength = 0;
					this.snaps = [];
					for (var i = 0, len = items.length; i < len; i++) {
						var item = items[i];
						if (item.parentNode === this.scroller) {
							this.itemLength++;
							this.snaps.push(item);
						}
					}
					this._initSnap(); //需要每次都_initSnap么。其实init的时候执行一次，后续resize的时候执行一次就行了吧.先这么做吧，如果影响性能，再调整
				}
			},
			_momentum: function _momentum(current, distance, time, lowerMargin, wrapperSize, deceleration) {
				var speed = parseFloat(Math.abs(distance) / time),
				    destination,
				    duration;

				deceleration = deceleration === undefined ? 0.0006 : deceleration;
				destination = current + speed * speed / (2 * deceleration) * (distance < 0 ? -1 : 1);
				duration = speed / deceleration;
				if (destination < lowerMargin) {
					destination = wrapperSize ? lowerMargin - wrapperSize / 2.5 * (speed / 8) : lowerMargin;
					distance = Math.abs(destination - current);
					duration = distance / speed;
				} else if (destination > 0) {
					destination = wrapperSize ? wrapperSize / 2.5 * (speed / 8) : 0;
					distance = Math.abs(current) + destination;
					duration = distance / speed;
				}

				return {
					destination: Math.round(destination),
					duration: duration
				};
			},
			_getTranslateStr: function _getTranslateStr(x, y) {
				if (this.options.hardwareAccelerated) {
					return 'translate3d(' + x + 'px,' + y + 'px,0px) ' + this.translateZ;
				}
				return 'translate(' + x + 'px,' + y + 'px) ';
			},
			//API
			setStopped: function setStopped(stopped) {
				this.stopped = !!stopped;
			},
			setTranslate: function setTranslate(x, y) {
				this.x = x;
				this.y = y;
				this.scrollerStyle['webkitTransform'] = this._getTranslateStr(x, y);
				if (this.parallaxElement && this.options.scrollY) {
					//目前仅支持竖向视差效果
					var parallaxY = y * this.options.parallaxRatio;
					var scale = 1 + parallaxY / ((this.parallaxHeight - parallaxY) / 2);
					if (scale > 1) {
						this.parallaxImgStyle['opacity'] = 1 - parallaxY / 100 * this.options.parallaxRatio;
						this.parallaxStyle['webkitTransform'] = this._getTranslateStr(0, -parallaxY) + ' scale(' + scale + ',' + scale + ')';
					} else {
						this.parallaxImgStyle['opacity'] = 1;
						this.parallaxStyle['webkitTransform'] = this._getTranslateStr(0, -1) + ' scale(1,1)';
					}
				}
				if (this.indicators) {
					for (var i = this.indicators.length; i--;) {
						this.indicators[i].updatePosition();
					}
				}
				this.lastX = this.x;
				this.lastY = this.y;
				$.trigger(this.scroller, 'scroll', this);
			},
			reLayout: function reLayout() {
				this.wrapper.offsetHeight;

				var paddingLeft = parseFloat($.getStyles(this.wrapper, 'padding-left')) || 0;
				var paddingRight = parseFloat($.getStyles(this.wrapper, 'padding-right')) || 0;
				var paddingTop = parseFloat($.getStyles(this.wrapper, 'padding-top')) || 0;
				var paddingBottom = parseFloat($.getStyles(this.wrapper, 'padding-bottom')) || 0;

				var clientWidth = this.wrapper.clientWidth;
				var clientHeight = this.wrapper.clientHeight;

				this.scrollerWidth = this.scroller.offsetWidth;
				this.scrollerHeight = this.scroller.offsetHeight;

				this.wrapperWidth = clientWidth - paddingLeft - paddingRight;
				this.wrapperHeight = clientHeight - paddingTop - paddingBottom;

				this.maxScrollX = Math.min(this.wrapperWidth - this.scrollerWidth, 0);
				this.maxScrollY = Math.min(this.wrapperHeight - this.scrollerHeight, 0);
				this.hasHorizontalScroll = this.options.scrollX && this.maxScrollX < 0;
				this.hasVerticalScroll = this.options.scrollY && this.maxScrollY < 0;
				this._reLayout();
			},
			resetPosition: function resetPosition(time) {
				var x = this.x,
				    y = this.y;

				time = time || 0;
				if (!this.hasHorizontalScroll || this.x > 0) {
					x = 0;
				} else if (this.x < this.maxScrollX) {
					x = this.maxScrollX;
				}

				if (!this.hasVerticalScroll || this.y > 0) {
					y = 0;
				} else if (this.y < this.maxScrollY) {
					y = this.maxScrollY;
				}

				if (x == this.x && y == this.y) {
					return false;
				}
				this.scrollTo(x, y, time, this.options.scrollEasing);

				return true;
			},
			refresh: function refresh() {
				this.reLayout();
				$.trigger(this.scroller, 'refresh', this);
				this.resetPosition();
			},
			scrollTo: function scrollTo(x, y, time, easing) {
				var easing = easing || ease.circular;
				//			this.isInTransition = time > 0 && (this.lastX != x || this.lastY != y);
				//暂不严格判断x,y，否则会导致部分版本上不正常触发轮播
				this.isInTransition = time > 0;
				if (this.isInTransition) {
					this._clearRequestAnimationFrame();
					this._transitionTimingFunction(easing.style);
					this._transitionTime(time);
					this.setTranslate(x, y);
				} else {
					this.setTranslate(x, y);
				}
			},
			scrollToBottom: function scrollToBottom(time, easing) {
				time = time || this.options.scrollTime;
				this.scrollTo(0, this.maxScrollY, time, easing);
			},
			gotoPage: function gotoPage(index) {
				this._gotoPage(index);
			},
			destroy: function destroy() {
				this._initEvent(true); //detach
				delete $.data[this.wrapper.getAttribute('data-scroll')];
				this.wrapper.setAttribute('data-scroll', '');
			}
		});
		//Indicator
		var Indicator = function Indicator(scroller, options) {
			this.wrapper = typeof options.el == 'string' ? document.querySelector(options.el) : options.el;
			this.wrapperStyle = this.wrapper.style;
			this.indicator = this.wrapper.children[0];
			this.indicatorStyle = this.indicator.style;
			this.scroller = scroller;

			this.options = $.extend({
				listenX: true,
				listenY: true,
				fade: false,
				speedRatioX: 0,
				speedRatioY: 0
			}, options);

			this.sizeRatioX = 1;
			this.sizeRatioY = 1;
			this.maxPosX = 0;
			this.maxPosY = 0;

			if (this.options.fade) {
				this.wrapperStyle['webkitTransform'] = this.scroller.translateZ;
				this.wrapperStyle['webkitTransitionDuration'] = this.options.fixedBadAndorid && $.os.isBadAndroid ? '0.001s' : '0ms';
				this.wrapperStyle.opacity = '0';
			}
		};
		Indicator.prototype = {
			handleEvent: function handleEvent(e) {},
			transitionTime: function transitionTime(time) {
				time = time || 0;
				this.indicatorStyle['webkitTransitionDuration'] = time + 'ms';
				if (this.scroller.options.fixedBadAndorid && !time && $.os.isBadAndroid) {
					this.indicatorStyle['webkitTransitionDuration'] = '0.001s';
				}
			},
			transitionTimingFunction: function transitionTimingFunction(easing) {
				this.indicatorStyle['webkitTransitionTimingFunction'] = easing;
			},
			refresh: function refresh() {
				this.transitionTime();

				if (this.options.listenX && !this.options.listenY) {
					this.indicatorStyle.display = this.scroller.hasHorizontalScroll ? 'block' : 'none';
				} else if (this.options.listenY && !this.options.listenX) {
					this.indicatorStyle.display = this.scroller.hasVerticalScroll ? 'block' : 'none';
				} else {
					this.indicatorStyle.display = this.scroller.hasHorizontalScroll || this.scroller.hasVerticalScroll ? 'block' : 'none';
				}

				this.wrapper.offsetHeight; // force refresh

				if (this.options.listenX) {
					this.wrapperWidth = this.wrapper.clientWidth;
					this.indicatorWidth = Math.max(Math.round(this.wrapperWidth * this.wrapperWidth / (this.scroller.scrollerWidth || this.wrapperWidth || 1)), 8);
					this.indicatorStyle.width = this.indicatorWidth + 'px';

					this.maxPosX = this.wrapperWidth - this.indicatorWidth;

					this.minBoundaryX = 0;
					this.maxBoundaryX = this.maxPosX;

					this.sizeRatioX = this.options.speedRatioX || this.scroller.maxScrollX && this.maxPosX / this.scroller.maxScrollX;
				}

				if (this.options.listenY) {
					this.wrapperHeight = this.wrapper.clientHeight;
					this.indicatorHeight = Math.max(Math.round(this.wrapperHeight * this.wrapperHeight / (this.scroller.scrollerHeight || this.wrapperHeight || 1)), 8);
					this.indicatorStyle.height = this.indicatorHeight + 'px';

					this.maxPosY = this.wrapperHeight - this.indicatorHeight;

					this.minBoundaryY = 0;
					this.maxBoundaryY = this.maxPosY;

					this.sizeRatioY = this.options.speedRatioY || this.scroller.maxScrollY && this.maxPosY / this.scroller.maxScrollY;
				}

				this.updatePosition();
			},

			updatePosition: function updatePosition() {
				var x = this.options.listenX && Math.round(this.sizeRatioX * this.scroller.x) || 0,
				    y = this.options.listenY && Math.round(this.sizeRatioY * this.scroller.y) || 0;

				if (x < this.minBoundaryX) {
					this.width = Math.max(this.indicatorWidth + x, 8);
					this.indicatorStyle.width = this.width + 'px';
					x = this.minBoundaryX;
				} else if (x > this.maxBoundaryX) {
					this.width = Math.max(this.indicatorWidth - (x - this.maxPosX), 8);
					this.indicatorStyle.width = this.width + 'px';
					x = this.maxPosX + this.indicatorWidth - this.width;
				} else if (this.width != this.indicatorWidth) {
					this.width = this.indicatorWidth;
					this.indicatorStyle.width = this.width + 'px';
				}

				if (y < this.minBoundaryY) {
					this.height = Math.max(this.indicatorHeight + y * 3, 8);
					this.indicatorStyle.height = this.height + 'px';
					y = this.minBoundaryY;
				} else if (y > this.maxBoundaryY) {
					this.height = Math.max(this.indicatorHeight - (y - this.maxPosY) * 3, 8);
					this.indicatorStyle.height = this.height + 'px';
					y = this.maxPosY + this.indicatorHeight - this.height;
				} else if (this.height != this.indicatorHeight) {
					this.height = this.indicatorHeight;
					this.indicatorStyle.height = this.height + 'px';
				}

				this.x = x;
				this.y = y;

				this.indicatorStyle['webkitTransform'] = this.scroller._getTranslateStr(x, y);
			},
			fade: function fade(val, hold) {
				if (hold && !this.visible) {
					return;
				}

				clearTimeout(this.fadeTimeout);
				this.fadeTimeout = null;

				var time = val ? 250 : 500,
				    delay = val ? 0 : 300;

				val = val ? '1' : '0';

				this.wrapperStyle['webkitTransitionDuration'] = time + 'ms';

				this.fadeTimeout = setTimeout(function (val) {
					this.wrapperStyle.opacity = val;
					this.visible = +val;
				}.bind(this, val), delay);
			}
		};

		$.Scroll = Scroll;

		$.fn.scroll = function (options) {
			var scrollApis = [];
			this.each(function () {
				var scrollApi = null;
				var self = this;
				var id = self.getAttribute('data-scroll');
				if (!id) {
					id = ++$.uuid;
					var _options = $.extend({}, options);
					if (self.classList.contains('mui-segmented-control')) {
						_options = $.extend(_options, {
							scrollY: false,
							scrollX: true,
							indicators: false,
							snap: '.mui-control-item'
						});
					}
					$.data[id] = scrollApi = new Scroll(self, _options);
					self.setAttribute('data-scroll', id);
				} else {
					scrollApi = $.data[id];
				}
				scrollApis.push(scrollApi);
			});
			return scrollApis.length === 1 ? scrollApis[0] : scrollApis;
		};
	})(R, window, document);

/***/ },
/* 144 */
/***/ function(module, exports) {

	'use strict';

	(function ($, window) {
			var CLASS_ACTIVE = 'mui-active';
			/**
	   * 自动消失提示框
	   */
			$.toast = function (message, time, cb) {
					// 只传两个参数，如果第二个参数是函数，则认为是callback
					if ($.isFunction(time)) {
							cb = time;
							time = null;
					}

					time || (time = 2000);
					message = message || "";
					var toast = document.createElement('div');
					toast.classList.add('mui-toast-container');
					toast.innerHTML = '<span class="' + 'mui-toast-message' + '">' + message + '</span>';
					toast.addEventListener('webkitTransitionEnd', function () {
							if (!toast.classList.contains(CLASS_ACTIVE)) {
									toast.parentNode.removeChild(toast);
									cb && cb();
							}
					});
					document.body.appendChild(toast);
					toast.offsetHeight;
					toast.classList.add(CLASS_ACTIVE);
					setTimeout(function () {
							toast.classList.remove(CLASS_ACTIVE);
					}, time);
			};

			$.loading = function (i) {
					if (i == -1) {
							var lel = document.querySelector(".loading-wrapper");
							lel && document.body.removeChild(lel);
							return;
					}
					var l = document.createElement('div');
					l.classList.add('loading-wrapper');
					l.innerHTML = '\n\t\t<div class="loader-inner ball-clip-rotate-multiple">\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t\t<div></div>\n\t\t\t</div>\n\t\t';
					document.body.appendChild(l);
			};
	})(R, window);

/***/ },
/* 145 */
/***/ function(module, exports) {

	'use strict';

	/**
	 * 选择列表插件
	 * varstion 2.0.0
	 * by Houfeng
	 * Houfeng@DCloud.io
	 */

	(function ($, window, document, undefined) {

		var MAX_EXCEED = 30;
		var VISIBLE_RANGE = 90;
		var DEFAULT_ITEM_HEIGHT = 40;
		var BLUR_WIDTH = 10;

		var rad2deg = $.rad2deg = function (rad) {
			return rad / (Math.PI / 180);
		};

		var deg2rad = $.deg2rad = function (deg) {
			return deg * (Math.PI / 180);
		};

		var platform = navigator.platform.toLowerCase();
		var userAgent = navigator.userAgent.toLowerCase();
		var isIos = (userAgent.indexOf('iphone') > -1 || userAgent.indexOf('ipad') > -1 || userAgent.indexOf('ipod') > -1) && (platform.indexOf('iphone') > -1 || platform.indexOf('ipad') > -1 || platform.indexOf('ipod') > -1);
		//alert(isIos);

		var Picker = $.Picker = function (holder, options) {
			var self = this;
			self.holder = holder;
			self.options = options || {};
			self.init();
			self.initInertiaParams();
			self.calcElementItemPostion(true);
			self.bindEvent();
		};

		Picker.prototype.findElementItems = function () {
			var self = this;
			self.elementItems = [].slice.call(self.holder.querySelectorAll('li'));
			return self.elementItems;
		};

		Picker.prototype.init = function () {
			var self = this;
			self.list = self.holder.querySelector('ul');
			self.findElementItems();
			self.height = self.holder.offsetHeight;
			self.r = self.height / 2 - BLUR_WIDTH;
			self.d = self.r * 2;
			self.itemHeight = self.elementItems.length > 0 ? self.elementItems[0].offsetHeight : DEFAULT_ITEM_HEIGHT;
			self.itemAngle = parseInt(self.calcAngle(self.itemHeight * 0.8));
			self.hightlightRange = self.itemAngle / 2;
			self.visibleRange = VISIBLE_RANGE;
			self.beginAngle = 0;
			self.beginExceed = self.beginAngle - MAX_EXCEED;
			self.list.angle = self.beginAngle;
			if (isIos) {
				self.list.style.webkitTransformOrigin = "center center " + self.r + "px";
			}
		};

		Picker.prototype.calcElementItemPostion = function (andGenerateItms) {
			var self = this;
			if (andGenerateItms) {
				self.items = [];
			}
			self.elementItems.forEach(function (item) {
				var index = self.elementItems.indexOf(item);
				self.endAngle = self.itemAngle * index;
				item.angle = self.endAngle;
				item.style.webkitTransformOrigin = "center center -" + self.r + "px";
				item.style.webkitTransform = "translateZ(" + self.r + "px) rotateX(" + -self.endAngle + "deg)";
				if (andGenerateItms) {
					var dataItem = {};
					dataItem.text = item.innerHTML || '';
					dataItem.value = item.getAttribute('data-value') || dataItem.text;
					self.items.push(dataItem);
				}
			});
			self.endExceed = self.endAngle + MAX_EXCEED;
			self.calcElementItemVisibility(self.beginAngle);
		};

		Picker.prototype.calcAngle = function (c) {
			var self = this;
			var a = parseFloat(self.r);
			var b = a;
			//直径的整倍数部分直接乘以 180
			c = Math.abs(c); //只算角度不关心正否值
			var intDeg = parseInt(c / self.d) * 180;
			c = c % self.d;
			//余弦
			var cosC = (a * a + b * b - c * c) / (2 * a * b);
			var angleC = intDeg + rad2deg(Math.acos(cosC));
			return angleC;
		};

		Picker.prototype.calcElementItemVisibility = function (angle) {
			var self = this;
			self.elementItems.forEach(function (item) {
				var difference = Math.abs(item.angle - angle);
				if (difference < self.hightlightRange) {
					item.classList.add('highlight');
				} else if (difference < self.visibleRange) {
					item.classList.add('visible');
					item.classList.remove('highlight');
				} else {
					item.classList.remove('highlight');
					item.classList.remove('visible');
				}
			});
		};

		Picker.prototype.setAngle = function (angle) {
			var self = this;
			self.list.angle = angle;
			self.list.style.webkitTransform = "perspective(1000px) rotateY(0deg) rotateX(" + angle + "deg)";
			self.calcElementItemVisibility(angle);
		};

		Picker.prototype.bindEvent = function () {
			var self = this;
			var lastAngle = 0;
			var startY = null;
			self.holder.addEventListener('touchstart', function (event) {
				event.preventDefault();
				self.list.style.webkitTransition = '';
				startY = (event.changedTouches ? event.changedTouches[0] : event).pageY;
				lastAngle = self.list.angle;
				self.updateInertiaParams(event, true);
			}, false);
			self.holder.addEventListener('touchend', function (event) {
				event.preventDefault();
				self.startInertiaScroll(event);
			}, false);
			self.holder.addEventListener('touchcancel', function (event) {
				event.preventDefault();
				self.startInertiaScroll(event);
			}, false);
			self.holder.addEventListener('touchmove', function (event) {
				event.preventDefault();
				var endY = (event.changedTouches ? event.changedTouches[0] : event).pageY;
				var dragRange = endY - startY;
				var dragAngle = self.calcAngle(dragRange);
				var newAngle = dragRange > 0 ? lastAngle - dragAngle : lastAngle + dragAngle;
				if (newAngle > self.endExceed) {
					newAngle = self.endExceed;
				}
				if (newAngle < self.beginExceed) {
					newAngle = self.beginExceed;
				}
				self.setAngle(newAngle);
				self.updateInertiaParams(event);
			}, false);
			//--
			self.list.addEventListener('tap', function (event) {
				var elementItem = event.target;
				if (elementItem.tagName == 'LI') {
					self.setSelectedIndex(self.elementItems.indexOf(elementItem), 200);
				}
			}, false);
		};

		Picker.prototype.initInertiaParams = function () {
			var self = this;
			self.lastMoveTime = 0;
			self.lastMoveStart = 0;
			self.stopInertiaMove = false;
		};

		Picker.prototype.updateInertiaParams = function (event, isStart) {
			var self = this;
			var point = event.changedTouches ? event.changedTouches[0] : event;
			if (isStart) {
				self.lastMoveStart = point.pageY;
				self.lastMoveTime = event.timeStamp || Date.now();
				self.startAngle = self.list.angle;
			} else {
				var nowTime = event.timeStamp || Date.now();
				if (nowTime - self.lastMoveTime > 300) {
					self.lastMoveTime = nowTime;
					self.lastMoveStart = point.pageY;
				}
			}
			self.stopInertiaMove = true;
		};

		Picker.prototype.startInertiaScroll = function (event) {
			var self = this;
			var point = event.changedTouches ? event.changedTouches[0] : event;
			/**
	   * 缓动代码
	   */
			var nowTime = event.timeStamp || Date.now();
			var v = (point.pageY - self.lastMoveStart) / (nowTime - self.lastMoveTime); //最后一段时间手指划动速度
			var dir = v > 0 ? -1 : 1; //加速度方向
			var deceleration = dir * 0.0006 * -1;
			var duration = Math.abs(v / deceleration); // 速度消减至0所需时间
			var dist = v * duration / 2; //最终移动多少
			var startAngle = self.list.angle;
			var distAngle = self.calcAngle(dist) * dir;
			//----
			var srcDistAngle = distAngle;
			if (startAngle + distAngle < self.beginExceed) {
				distAngle = self.beginExceed - startAngle;
				duration = duration * (distAngle / srcDistAngle) * 0.6;
			}
			if (startAngle + distAngle > self.endExceed) {
				distAngle = self.endExceed - startAngle;
				duration = duration * (distAngle / srcDistAngle) * 0.6;
			}
			//----
			if (distAngle == 0) {
				self.endScroll();
				return;
			}
			self.scrollDistAngle(nowTime, startAngle, distAngle, duration);
		};

		Picker.prototype.scrollDistAngle = function (nowTime, startAngle, distAngle, duration) {
			var self = this;
			self.stopInertiaMove = false;
			(function (nowTime, startAngle, distAngle, duration) {
				var frameInterval = 13;
				var stepCount = duration / frameInterval;
				var stepIndex = 0;
				(function inertiaMove() {
					if (self.stopInertiaMove) return;
					var newAngle = self.quartEaseOut(stepIndex, startAngle, distAngle, stepCount);
					self.setAngle(newAngle);
					stepIndex++;
					if (stepIndex > stepCount - 1 || newAngle < self.beginExceed || newAngle > self.endExceed) {
						self.endScroll();
						return;
					}
					setTimeout(inertiaMove, frameInterval);
				})();
			})(nowTime, startAngle, distAngle, duration);
		};

		Picker.prototype.quartEaseOut = function (t, b, c, d) {
			return -c * ((t = t / d - 1) * t * t * t - 1) + b;
		};

		Picker.prototype.endScroll = function () {
			var self = this;
			if (self.list.angle < self.beginAngle) {
				self.list.style.webkitTransition = "150ms ease-out";
				self.setAngle(self.beginAngle);
			} else if (self.list.angle > self.endAngle) {
				self.list.style.webkitTransition = "150ms ease-out";
				self.setAngle(self.endAngle);
			} else {
				var index = parseInt((self.list.angle / self.itemAngle).toFixed(0));
				self.list.style.webkitTransition = "100ms ease-out";
				self.setAngle(self.itemAngle * index);
			}
			self.triggerChange();
		};

		Picker.prototype.triggerChange = function (force) {
			var self = this;
			setTimeout(function () {
				var index = self.getSelectedIndex();
				var item = self.items[index];
				if ($.trigger && (index != self.lastIndex || force)) {
					$.trigger(self.holder, 'change', {
						"index": index,
						"item": item
					});
					//console.log('change:' + index);
				}
				self.lastIndex = index;
			}, 0);
		};

		Picker.prototype.correctAngle = function (angle) {
			var self = this;
			if (angle < self.beginAngle) {
				return self.beginAngle;
			} else if (angle > self.endAngle) {
				return self.endAngle;
			} else {
				return angle;
			}
		};

		Picker.prototype.setItems = function (items) {
			var self = this;
			self.items = items || [];
			var buffer = [];
			self.items.forEach(function (item) {
				if (item !== null && item !== undefined) {
					buffer.push('<li>' + (item.text || item) + '</li>');
				}
			});
			self.list.innerHTML = buffer.join('');
			self.findElementItems();
			self.calcElementItemPostion();
			self.setAngle(self.correctAngle(self.list.angle));
			self.triggerChange(true);
		};

		Picker.prototype.getItems = function () {
			var self = this;
			return self.items;
		};

		Picker.prototype.getSelectedIndex = function () {
			var self = this;
			return parseInt((self.list.angle / self.itemAngle).toFixed(0));
		};

		Picker.prototype.setSelectedIndex = function (index, duration) {
			var self = this;
			self.list.style.webkitTransition = '';
			var angle = self.correctAngle(self.itemAngle * index);
			if (duration && duration > 0) {
				var distAngle = angle - self.list.angle;
				self.scrollDistAngle(Date.now(), self.list.angle, distAngle, duration);
			} else {
				self.setAngle(angle);
			}
			self.triggerChange();
		};

		Picker.prototype.getSelectedItem = function () {
			var self = this;
			return self.items[self.getSelectedIndex()];
		};

		Picker.prototype.getSelectedValue = function () {
			var self = this;
			return (self.items[self.getSelectedIndex()] || {}).value;
		};

		Picker.prototype.getSelectedText = function () {
			var self = this;
			return (self.items[self.getSelectedIndex()] || {}).text;
		};

		Picker.prototype.setSelectedValue = function (value, duration) {
			var self = this;
			for (var index in self.items) {
				var item = self.items[index];
				if (item.value == value) {
					self.setSelectedIndex(index, duration);
					return;
				}
			}
		};

		// if ($.fn) {
		// 	$.fn.picker = function(options) {
		// 		//遍历选择的元素
		// 		this.each(function(i, element) {
		// 			if (element.picker) return;
		// 			if (options) {
		// 				element.picker = new Picker(element, options);
		// 			} else {
		// 				var optionsText = element.getAttribute('data-picker-options');
		// 				var _options = optionsText ? JSON.parse(optionsText) : {};
		// 				element.picker = new Picker(element, _options);
		// 			}
		// 		});
		// 		return this[0] ? this[0].picker : null;
		// 	};
		//
		// 	//自动初始化
		// 	$.ready(function() {
		// 		// $('.mui-picker').picker();
		// 	});
		// }
	})(R || window, window, document, undefined);
	//end

/***/ },
/* 146 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';

	var _toConsumableArray2 = __webpack_require__(147);

	var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	/**
	 * 日期时间插件
	 * varstion 1.0.5
	 * rongzhi
	 */
	// require('./picker/date.less');
	//暂时不用rem 麻烦 －－！

	(function ($, document) {

		//创建 DOM
		$.dom = function (str) {
			if (typeof str !== 'string') {
				if (str instanceof Array || str[0] && str.length) {
					return [].slice.call(str);
				} else {
					return [str];
				}
			}
			if (!$.__create_dom_div__) {
				$.__create_dom_div__ = document.createElement('div');
			}
			$.__create_dom_div__.innerHTML = str;
			return [].slice.call($.__create_dom_div__.childNodes);
		};

		var domBuffer = '<div class="mui-dtpicker">\
			<div class="mui-dtpicker-header">\
				<span data-id="btn-cancel" >取消</span>\
				<span data-id="btn-ok" >确定</span>\
			</div>\
			<div class="mui-dtpicker-body">\
			</div>\
		</div>';

		//plugin
		var DtPicker = $.DtPicker = $.Class.extend({

			init: function init(options) {

				var self = this;
				var _picker = $.dom(domBuffer)[0];

				var uls = options.map(function (each, index) {
					return '\n        <div data-id="picker-' + index + '" class="mui-picker" style=width:' + each.width + '>\n          <div class="mui-picker-inner">\n            <div class="mui-pciker-rule mui-pciker-rule-ft"></div>\n            <ul class="mui-pciker-list">\n            </ul>\n            <div class="mui-pciker-rule mui-pciker-rule-bg"></div>\n          </div>        </div>        ';
				});

				_picker.querySelector(".mui-dtpicker-body").innerHTML = uls.join("");
				var mask = $.dom('<div class="selector-mask-pic"></div>')[0];
				var body = _picker.querySelector(".mui-dtpicker-body");

				document.body.appendChild(_picker);

				var pikerList = options.map(function (each, i) {
					var element = _picker.querySelector("[data-id=picker-" + i + "]");
					return new R.Picker(element, {});
				});

				var ui = self.ui = {
					picker: _picker,
					mask: mask,
					body: body,
					ok: $('[data-id="btn-ok"]', _picker)[0],
					cancel: $('[data-id="btn-cancel"]', _picker)[0],
					pikerList: pikerList
				};

				ui.cancel.addEventListener('click', function () {
					self.hide();
				}, false);
				ui.ok.addEventListener('click', function () {
					var rs = self._onsure.apply(self, self.ui.pikerList.map(function (each) {
						return each.getSelectedItem();
					}));
					if (rs !== false) {
						self.hide();
					}
				}, false);

				ui.mask.addEventListener('click', function () {
					self.hide();
				}, false);

				//防止滚动穿透
				self.ui.body.addEventListener('touchstart', function (event) {
					event.preventDefault();
				}, false);
				self.ui.body.addEventListener('touchmove', function (event) {
					event.preventDefault();
				}, false);
			},
			getSelected: function getSelected(picker) {
				var self = this;
				return picker.getSelectedItem();
			},
			onchange: function onchange() {
				return this;
			},
			onsure: function onsure(fn) {
				this._onsure = fn;
				return this;
			},
			setOpt: function setOpt(picker, tpl, attr) {
				//适配原业务代码 - - !
				var div = document.createElement("div");
				div.innerHTML = tpl;
				var liarr = [].slice.call(div.querySelectorAll("li"));
				var array = liarr.map(function (each) {
					return {
						text: each.innerText,
						value: each.getAttribute("data-value")
					};
				});
				picker.setItems(array);

				return this;
			},

			setByVal: function setByVal(picker, val) {
				picker.setSelectedValue(val);
				return this;
			},

			beforeShow: function beforeShow(fn) {
				this._beforeShow = fn;
				return this;
			},

			//显示
			show: function show() {
				var self = this;
				var ui = self.ui;

				if (self._beforeShow) {
					self._beforeShow.apply(self, (0, _toConsumableArray3.default)(ui.pikerList));
				}
				document.body.classList.add("mui-dtpicker-active-for-page");
				document.body.appendChild(ui.mask);
				// document.body.appendChild(ui.picker);
				ui.mask.offsetHeight;
				ui.mask.classList.add("active");
				ui.picker.classList.add('mui-active');
			},
			hide: function hide() {
				var self = this;
				var ui = self.ui;
				document.body.classList.remove("mui-dtpicker-active-for-page");

				ui.picker.classList.remove("mui-active");
				ui.mask.classList.remove("active");
				ui.picker.addEventListener("webkitTransitionEnd", function () {
					if (!this.classList.contains("mui-active")) {
						// this.parentNode && this.parentNode.removeChild(this);
					}
				});
				ui.mask.addEventListener("webkitTransitionEnd", function () {
					if (!this.classList.contains("active")) {
						this.parentNode && this.parentNode.removeChild(this);
					}
				});
			},
			dispose: function dispose() {
				var self = this;
				self.hide();
				setTimeout(function () {
					self.ui.picker.parentNode.removeChild(self.ui.picker);
					for (var name in self) {
						self[name] = null;
						delete self[name];
					};
					self.disposed = true;
				}, 300);
			}
		});
	})(R, document);

/***/ },
/* 147 */
/***/ function(module, exports, __webpack_require__) {

	"use strict";

	exports.__esModule = true;

	var _from = __webpack_require__(148);

	var _from2 = _interopRequireDefault(_from);

	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

	exports.default = function (arr) {
	  if (Array.isArray(arr)) {
	    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
	      arr2[i] = arr[i];
	    }

	    return arr2;
	  } else {
	    return (0, _from2.default)(arr);
	  }
	};

/***/ },
/* 148 */
/***/ function(module, exports, __webpack_require__) {

	module.exports = { "default": __webpack_require__(149), __esModule: true };

/***/ },
/* 149 */
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(25);
	__webpack_require__(150);
	module.exports = __webpack_require__(3).Array.from;

/***/ },
/* 150 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	var ctx            = __webpack_require__(10)
	  , $export        = __webpack_require__(8)
	  , toObject       = __webpack_require__(53)
	  , call           = __webpack_require__(94)
	  , isArrayIter    = __webpack_require__(95)
	  , toLength       = __webpack_require__(43)
	  , createProperty = __webpack_require__(151)
	  , getIterFn      = __webpack_require__(96);

	$export($export.S + $export.F * !__webpack_require__(103)(function(iter){ Array.from(iter); }), 'Array', {
	  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
	  from: function from(arrayLike/*, mapfn = undefined, thisArg = undefined*/){
	    var O       = toObject(arrayLike)
	      , C       = typeof this == 'function' ? this : Array
	      , aLen    = arguments.length
	      , mapfn   = aLen > 1 ? arguments[1] : undefined
	      , mapping = mapfn !== undefined
	      , index   = 0
	      , iterFn  = getIterFn(O)
	      , length, result, step, iterator;
	    if(mapping)mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
	    // if object isn't iterable or it's array with default iterator - use simple case
	    if(iterFn != undefined && !(C == Array && isArrayIter(iterFn))){
	      for(iterator = iterFn.call(O), result = new C; !(step = iterator.next()).done; index++){
	        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
	      }
	    } else {
	      length = toLength(O.length);
	      for(result = new C(length); length > index; index++){
	        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
	      }
	    }
	    result.length = index;
	    return result;
	  }
	});


/***/ },
/* 151 */
/***/ function(module, exports, __webpack_require__) {

	'use strict';
	var $defineProperty = __webpack_require__(13)
	  , createDesc      = __webpack_require__(21);

	module.exports = function(object, index, value){
	  if(index in object)$defineProperty.f(object, index, createDesc(0, value));
	  else object[index] = value;
	};

/***/ }
/******/ ]);